std::chrono::year_month_day::ok
From cppreference.com
< cpp | chrono | year month day
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Date and time library
(C++11)
(C++20)
(C++20)
(C++11)
(C++11)
(C++11)
(C++20)
(C++20)
(C++20)
(C++11)
(C++20)
(C++20)
(C++20)
(C++20)(C++20)
(C++20)(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)(C++20)
(C++20)
(C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
std::chrono::year_month_day
Member functions
year_month_day::ok
Nonmember functions
Helper classes
constexpr bool ok() const noexcept;
(since C++20)
Checks if this year_month_day
object represents a valid calendar date.
[edit] Return value
true if this year_month_day
object represents a valid calendar date, that is, the stored year, month, and day values are all valid and the stored day value is within the number of days in the given year and month. Otherwise false.
[edit] Possible implementation
constexpr bool std::chrono::year_month_day::ok() const noexcept { return year().ok() && month().ok() && day().ok() && day() <= (year()/month()/std::chrono::last ).day(); }
[edit] Example
Run this code
#include <chrono> int main() { constexpr auto ymd1 {std::chrono::day (1)/std::chrono::July /2020}; static_assert(ymd1.ok()); constexpr auto ymd2 {std::chrono::year (2020)/7/42}; static_assert(not ymd2.ok()); constexpr auto ymd3 {std::chrono::February /29/2020}; // ok, leap year static_assert(ymd3.ok()); constexpr auto ymd4 = ymd3 + std::chrono::years {1}; // bad, not a leap year static_assert(ymd4 == std::chrono::February /29/2021 and not ymd4.ok()); // to fix the bad date we may want to snap to the last day of the month: if constexpr (!ymd4.ok()) { constexpr auto ymd = ymd4.year()/ymd4.month()/std::chrono::last ; static_assert(ymd == std::chrono::February /28/2021 and ymd.ok()); } // or we may want to overflow to the next month: if constexpr (!ymd4.ok()) { constexpr auto st = std::chrono::sys_time <std::chrono::days >{ymd4}; constexpr auto ymd = std::chrono::year_month_day {st}; static_assert(ymd == std::chrono::March /1/2021 and ymd.ok()); } }