std::chrono::year_month_day:: operator sys_days, std::chrono::year_month_day:: operator local_days
From cppreference.net
<
cpp
|
chrono
|
year month day
|
constexpr
operator
std::
chrono
::
sys_days
(
)
const
noexcept
;
|
(1) | (начиная с C++20) |
|
constexpr
explicit
operator
std::
chrono
::
local_days
(
)
const
noexcept
;
|
(2) | (начиная с C++20) |
Преобразует
*
this
в
std::chrono::time_point
, представляющий ту же дату, что и этот
year_month_day
.
1)
Если
ok()
возвращает
true
, возвращаемое значение содержит количество дней от
std::chrono::system_clock
эпохи (1970-01-01) до
*
this
. Результат отрицательный, если
*
this
представляет дату, предшествующую этой эпохе.
В противном случае, если сохраненные год и месяц действительны (
year
(
)
.
ok
(
)
&&
month
(
)
.
ok
(
)
равно
true
), то возвращаемое значение равно
sys_days
(
year
(
)
/
month
(
)
/
1d
)
+
(
day
(
)
-
1d
)
.
В противном случае (если
year
(
)
.
ok
(
)
&&
month
(
)
.
ok
(
)
равно
false
), возвращаемое значение не определено.
Объект
std::chrono::sys_days
в диапазоне
[
std::
chrono
::
days
{
-
12687428
}
,
std::
chrono
::
days
{
11248737
}
]
, при преобразовании в
year_month_day
и обратно, даёт то же самое значение.
2)
То же, что и
(1)
, но возвращает
local_days
вместо этого. Эквивалентно
return
local_days
(
sys_days
(
*
this
)
.
time_since_epoch
(
)
)
;
.
Примечания
Преобразование в
std::chrono::sys_days
и обратно может использоваться для нормализации
year_month_day
, который содержит недопустимый день, но допустимые год и месяц:
using namespace std::chrono; auto ymd = 2017y/January/0; ymd = sys_days{ymd}; // ymd теперь 2016y/December/31
Нормализация года и месяца может быть выполнена путем добавления (или вычитания) нуля std::chrono::months :
using namespace std::chrono; constexpr year_month_day normalize(year_month_day ymd) { ymd += months{0}; // нормализует год и месяц return sys_days{ymd}; // нормализует день } static_assert(normalize(2017y/33/59) == 2019y/10/29);
Пример
Запустить этот код
#include <chrono> #include <iostream> int main() { using namespace std::chrono; const auto today = sys_days{std::chrono::floor<days>(system_clock::now())}; for (const year_month_day ymd : {{November/15/2020}, {November/15/2120}, today}) { std::cout << ymd; const auto delta = (sys_days{ymd} - today).count(); (delta < 0) ? std::cout << " was " << -delta << " day(s) ago\n" : (delta > 0) ? std::cout << " is " << delta << " day(s) from now\n" : std::cout << " is today!\n"; } }
Возможный вывод:
2020-11-15 was 1014 day(s) ago 2120-11-15 is 35510 day(s) from now 2023-08-26 is today!