C++20標準ヘッダ <chrono> カレンダー(Calendar)ライブラリが提供する、日付リテラル表記用の/演算子オーバーロード一覧。
ノート:年月日順で日付リテラルを述する場合、少なくとも年(year)フィールドは常に型を明示した方がトラブルリスク*1が小さい。/演算子は左結合となることをお忘れなく。
#include <chrono> using namespace std::chrono; // 2022-06-13 auto date1 = 2022y/6/13; // OK: year_month_day{year{2022}, month{6}, day{13}} auto date2 = 2022/June/13; // NG: ill-formed auto date3 = 2022/6/13d; // NG: month_day{month{337}, day{13}} auto date4 = 2022/6/13; // NG: int{25} auto date2m = 2022/(June/13); // OK: 意図通りに解釈されはするものの auto date2d = 2022/(6/13d); // OK: これらの難解表記は避けるべき…
年月日指定:*2
| 左辺 | 右辺 | 結果 | 表記 |
|---|---|---|---|
| year | month | year_month | 年/月 * |
| year | int | year_month | 年/月 * |
| month | day | month_day | 月/日 * |
| month | int | month_day | 月/日 * |
| int | day | month_day | 月/日 * |
| day | month | month_day | 日/月 |
| day | int | month_day | 日/月 |
| year_month | day | year_month_day | 年+月/日 * |
| year_month | int | year_month_day | 年+月/日 * |
| year | month_day | year_month_day | 年/月+日 * |
| int | month_day | year_month_day | 年/月+日 * |
| month_day | year | year_month_day | 月+日/年 |
| month_day | int | year_month_day | 月+日/年 |
最終日指定:*3
| 左辺 | 右辺 | 結果 | 表記 |
|---|---|---|---|
| month | last_spec | month_day_last | 月/最終日 * |
| int | last_spec | month_day_last | 月/最終日 * |
| last_spec | month | month_day_last | 最終日/月 |
| last_spec | int | month_day_last | 最終日/月 |
| year | month_day_last | year_month_ |
年/月+最終日 * |
| int | month_day_last | year_month_ |
年/月+最終日 * |
| month_day_last | year | year_month_ |
月+最終日/年 |
| month_day_last | int | year_month_ |
月+最終日/年 |
第n曜日指定:
| 左辺 | 右辺 | 結果 | 表記 |
|---|---|---|---|
| month | weekday_indexed | month_weekday | 月/第n曜日 * |
| int | weekday_indexed | month_weekday | 月/第n曜日 * |
| weekday_indexed | month | month_weekday | 第n曜日/月 |
| weekday_indexed | int | month_weekday | 第n曜日/月 |
| year_month | weekday_indexed | year_month_ |
年+月/第n曜日 * |
| year | month_weekday | year_month_ |
年/月+第n曜日 * |
| int | month_weekday | year_month_ |
年/月+第n曜日 * |
| month_weekday | year | year_month_ |
月+第n曜日/年 |
| month_weekday | int | year_month_ |
月+第n曜日/年 |
最終曜日指定:*4
| 左辺 | 右辺 | 結果 | 表記 |
|---|---|---|---|
| month | weekday_last | month_ |
月/最終曜日 * |
| int | weekday_last | month_ |
月/最終曜日 * |
| weekday_last | month | month_ |
最終曜日/月 |
| weekday_last | int | month_ |
最終曜日/月 |
| year_month | weekday_last | year_month_ |
年+月/最終曜日 * |
| year | month_ |
year_month_ |
年/月+最終曜日 * |
| int | month_ |
year_month_ |
年/月+最終曜日 * |
| month_ |
year | year_month_ |
月+最終曜日/年 |
| month_ |
int | year_month_ |
月+最終曜日/年 |
関連URL
- (PDF) A C++14 Approach to Dates and Times *5
- cppreference std::chrono::operator/ (calendar)
- C++標準ライブラリのカレンダー(Calendar) - yohhoyの日記
- C++20標準ライブラリ <chrono>ヘッダ Tips - Qiita
*1:date3 は std::chrome::month クラスの未規定(unspecified)仕様により、大半のC++処理系で month_day{month{81}, day{13}} として保持される可能性が高い。(C++20 27.8.4.1/p1, 27.8.4.2/p1)
*2:ISO 8601準拠の記述順(年-月-日)のみをサポートするならば、表中 * 印オーバーロードのみで十分だったはず。
*3:ある月の最終日表現には std::chrono::last 定数を用いる。
*4:ある月の最終曜日を std::chrono::weekday_last 型 = std::chrono::weekday 型 + std::chrono::last 定数で表現する。