std::chrono::year_month_day::operator sys_days, std::chrono::year_month_day::operator local_days
From cppreference.com
< 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以降) |
現在のyear_month_dayと同じ日付を表すstd::chrono::time_pointに変換します。
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::days{-12687428}, std::chrono::days{11248737}] の範囲にある std::chrono::sys_days を
year_month_day に変換してから元に戻すと、同じ値になります。2) (1) と同じですが、local_days を返します。 return local_days(sys_days(*this).time_since_epoch()); と等価です。
[編集] 注意
無効な日を含み、有効な年と月を持つ year_month_day を正規化するために、std::chrono::sys_days への変換と元に戻す操作を使用できます。
using namespace std::chrono; auto ymd = 2017y/January/0; ymd = sys_days{ymd}; // ymd is now 2016y/December/31
年と月の正規化は、ゼロの std::chrono::months を加算(または減算)することで行うことができます。
using namespace std::chrono; constexpr year_month_day normalize(year_month_day ymd) { ymd += months{0}; // normalizes year and month return sys_days{ymd}; // normalizes day } 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!