year_month_day() = default; // (1) C++20
constexpr year_month_day(
const chrono::year& y,
const chrono::month& m,
const chrono::day& d
) noexcept; // (2) C++20
constexpr year_month_day(const year_month_day_last& ymdl) noexcept; // (3) C++20
constexpr year_month_day(const sys_days& dp) noexcept; // (4) C++20
constexpr explicit year_month_day(const local_days& dp) noexcept; // (5) C++20
year_month_day(const year_month_day&) = default; // (6) C++20
year_month_day(year_month_day&&) = default; // (7) C++20
概要
- (1) : デフォルトコンストラクタ
- (2) : 年、月、日の値をそれぞれ指定して構築する
- (3) :
year_month_day_last
オブジェクトから変換し、日の値を求めて構築する - (4) : 日単位のシステム時間から変換して構築
- (5) : 日単位のローカル時間から変換して構築
- (6) : コピーコンストラクタ
- (7) : ムーブコンストラクタ
効果
- (1) :
- (2) :
y
、m
、d
をメンバ変数として保持する
- (3) :
- (4) :
dp
が指すシステム時間に対応する年、月、日の値を求めて構築する - (5) :
dp
が指すローカル時間に対応する年、月、日の値を求めて構築する
例外
投げない
備考
- (3) :
year_month_day_last
からsys_days
に一旦変換し、そこからyear_month_day
へ変換した方がより効率がよい可能性がある - (4) :
year_month_day
型オブジェクトymd
においてymd.ok()
である場合、ymd == year_month_day{sys_days{ymd}}
は常にtrue
となる - (5) :
sys_days{dp.time_since_epoch()}
からの構築と等価
例
#include <cassert>
#include <chrono>
namespace chrono = std::chrono;
using namespace std::chrono_literals;
int main()
{
// 年、月、日のカレンダー要素を順に指定して構築
chrono::year_month_day date1{2020y, chrono::March, 1d};
chrono::year_month_day date2{chrono::year{2020}, chrono::month{3}, chrono::day{1}};
assert(date1 == 2020y/3/1);
assert(date2 == 2020y/3/1);
// 年、月、月の最終日から構築
chrono::year_month_day date3 = 2020y/2/chrono::last; // 2020年2月の最終日
assert(date3 == 2020y/2/29);
// システム時間から変換
auto tp = chrono::system_clock::now();
chrono::sys_days dp = chrono::time_point_cast<chrono::days>(tp);
chrono::year_month_day date4 {dp};
std::cout << date4 << std::endl;
// ローカル時間から変換
chrono::local_days lp {dp.time_since_epoch()};
chrono::year_month_day date5 {lp};
std::cout << date5 << std::endl;
}
出力例
2019-12-19
2019-12-19
バージョン
言語
- C++20
処理系
- Clang: 8.0 ✅
- GCC: 9.2 ❌
- Visual C++: 2019 Update 3 ❌