C++20stladvanced
Calendar Types: day, month, year, weekday, weekday_indexed, weekday_last, month_day, month_day_last, month_weekday, month_weekday_last, year_month, year_month_day, year_month_day_last, year_month_weekday, year_month_weekday_last (C++20 Addition)
C++20 · The Big Four · Compiler flag: -std=c++20
Explanation
A comprehensive calendar type system that models dates, months, years, weekdays, and their combinations with full type safety. These types support arithmetic, comparison, and validation (e.g., checking if a date is valid).
Real-World Scenario
Schedule recurring events on specific weekdays (e.g., "the second Tuesday of every month") in a calendar application.
Quick Snippet
snippet.cpp
#include <chrono>
using namespace std::chrono;
auto today = year_month_day{year{2026}, month{3}, day{22}};
bool valid = today.ok(); // true
// Second Tuesday of March 2026
auto meeting = year{2026}/March/Tuesday[2];
auto meeting_date = year_month_day{sys_days{meeting}};Full Example
chrono_calendar.cpp
// CodeNebula - C++20 Example: Chrono Calendar Types
// Compile: g++ -std=c++20 -Wall -Wextra -o example chrono_calendar.cpp
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
std::cout << "=== Basic calendar types ===\n";
// day, month, year
day d{15};
month m{March};
year y{2024};
std::cout << "Day: " << unsigned(d) << ", Month: " << unsigned(m)
<< ", Year: " << int(y) << "\n";
// year_month_day - the primary calendar date type
year_month_day ymd{2024y / March / 15d};
std::cout << "Date: " << ymd << "\n";
std::cout << "Valid: " << ymd.ok() << "\n";
// Alternative construction syntaxes
auto date2 = 2024y / 3 / 15;
auto date3 = March / 15d / 2024y;
std::cout << "Same date: " << date2 << " == " << date3 << "\n";
std::cout << "\n=== Weekday ===\n";
weekday wd{Saturday};
std::cout << "Saturday iso_encoding: " << wd.iso_encoding() << "\n";
// Get weekday from a date
year_month_day today_ymd{2024y / July / 4d};
weekday today_wd{sys_days{today_ymd}};
std::cout << "July 4, 2024 is weekday: " << today_wd << "\n";
std::cout << "\n=== month_day, month_weekday ===\n";
month_day christmas{December / 25d};
std::cout << "Christmas: " << christmas << "\n";
// Third Monday of January (MLK Day)
month_weekday mlk{January / Monday[3]};
std::cout << "MLK Day pattern: " << mlk << "\n";
std::cout << "\n=== year_month_day_last ===\n";
// Last day of February in leap/non-leap years
year_month_day_last feb_last_2024{2024y / February / last};
year_month_day_last feb_last_2023{2023y / February / last};
std::cout << "Last day Feb 2024: " << year_month_day{feb_last_2024} << "\n";
std::cout << "Last day Feb 2023: " << year_month_day{feb_last_2023} << "\n";
std::cout << "\n=== Date arithmetic ===\n";
year_month_day start{2024y / January / 31d};
auto plus_one_month = start.year() / (start.month() + months{1}) / start.day();
std::cout << start << " + 1 month = " << plus_one_month
<< " (valid: " << plus_one_month.ok() << ")\n";
// Convert to sys_days for day-level arithmetic
sys_days sd = sys_days{start} + days{45};
year_month_day result{sd};
std::cout << start << " + 45 days = " << result << "\n";
// Difference between dates
auto diff = sys_days{2024y / December / 31d} - sys_days{2024y / January / 1d};
std::cout << "Days in 2024: " << diff.count() + 1 << "\n";
std::cout << "\n=== Leap year check ===\n";
for (int yr : {2020, 2023, 2024, 2100}) {
std::cout << yr << " is leap: " << year{yr}.is_leap() << "\n";
}
return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example chrono_calendar.cpp