{"id":9421,"date":"2024-04-15T09:20:17","date_gmt":"2024-04-15T09:20:17","guid":{"rendered":"https:\/\/www.modernescpp.com\/?p=9421"},"modified":"2024-04-15T09:20:18","modified_gmt":"2024-04-15T09:20:18","slug":"c20-displaying-and-checking-calendar-dates","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/c20-displaying-and-checking-calendar-dates\/","title":{"rendered":"C++20: Displaying and Checking Calendar Dates"},"content":{"rendered":"\n<p>I created calendar dates in my last post, &#8220;C++20: Creating Calendar Dates,&#8221; and I will display and check them today.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"411\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/03\/TimelineCpp20CoreLanguage-1.png\" alt=\"\" class=\"wp-image-9316\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/03\/TimelineCpp20CoreLanguage-1.png 960w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/03\/TimelineCpp20CoreLanguage-1-300x128.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/03\/TimelineCpp20CoreLanguage-1-768x329.png 768w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/03\/TimelineCpp20CoreLanguage-1-705x302.png 705w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/figure>\n\n\n\n<p>This post is the fifth in my detailed journey through the chrono extension in C++20:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.modernescpp.com\/index.php\/c20-basic-chrono-terminology\/\">Basic Chrono Terminology<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.modernescpp.com\/index.php\/c20-basic-chrono-terminology-with-time-duration-and-time-point\/\">Basic Chrono Terminology with Time Duration and Time Point<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.modernescpp.com\/index.php\/c20-time-of-day\/\">Time of Day: Details<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.modernescpp.com\/index.php\/c20-creating-calendar-dates\/\">C++20: Creating Calendar Dates<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Displaying Calendar Dates<\/h2>\n\n\n\n<p>Thanks to <code>std::chrono::local_days<\/code> or <code>std::chrono::sys_days<\/code>, you can convert calendar dates to a local or a system <code>std::chrono::time_point<\/code>. I use <code>std::chrono::sys_days<\/code> in my example. <code>std::chrono::sys_days<\/code> is based on <code><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/chrono\/system_clock\">std::chrono::system_clock<\/a><\/code>. <\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #0099FF; font-style: italic\">\/\/ sysDays.cpp<\/span>\n\n<span style=\"color: #009999\">#include &lt;chrono&gt;<\/span>\n<span style=\"color: #009999\">#include &lt;iostream&gt;<\/span>\n \n<span style=\"color: #007788; font-weight: bold\">int<\/span> <span style=\"color: #CC00FF\">main<\/span>() {\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>last;\n\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year;\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>sys_days;\n\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>March;\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>February;\n\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>Monday;\n    <span style=\"color: #006699; font-weight: bold\">using<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>Thursday;\n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> yearMonthDayLast{year(<span style=\"color: #FF6600\">2010<\/span>)<span style=\"color: #555555\">\/<\/span>March<span style=\"color: #555555\">\/<\/span>last};               <span style=\"color: #0099FF; font-style: italic\">\/\/ (1)<\/span>\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;sys_days(yearMonthDayLast): &quot;<\/span> \n              <span style=\"color: #555555\">&lt;&lt;<\/span> sys_days(yearMonthDayLast)  <span style=\"color: #555555\">&lt;&lt;<\/span>  <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> yearMonthWeekday{year(<span style=\"color: #FF6600\">2020<\/span>)<span style=\"color: #555555\">\/<\/span>March<span style=\"color: #555555\">\/<\/span>Thursday[<span style=\"color: #FF6600\">2<\/span>]};\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;sys_days(yearMonthWeekday): &quot;<\/span> \n              <span style=\"color: #555555\">&lt;&lt;<\/span>  sys_days(yearMonthWeekday) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> yearMonthWeekdayLast{year(<span style=\"color: #FF6600\">2010<\/span>)<span style=\"color: #555555\">\/<\/span>March<span style=\"color: #555555\">\/<\/span>Monday[last]};\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;sys_days(yearMonthWeekdayLast): &quot;<\/span> \n              <span style=\"color: #555555\">&lt;&lt;<\/span> sys_days(yearMonthWeekdayLast) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapDate{year(<span style=\"color: #FF6600\">2012<\/span>)<span style=\"color: #555555\">\/<\/span>February<span style=\"color: #555555\">\/<\/span>last};               \n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;sys_days(leapDate): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> sys_days(leapDate) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;    <span style=\"color: #0099FF; font-style: italic\">\/\/ (2)<\/span>\n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> noLeapDate{year(<span style=\"color: #FF6600\">2013<\/span>)<span style=\"color: #555555\">\/<\/span>February<span style=\"color: #555555\">\/<\/span>last};             \n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;sys_day(noLeapDate): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> sys_days(noLeapDate) <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>; <span style=\"color: #0099FF; font-style: italic\">\/\/ (3)<\/span>\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n}  \n<\/pre><\/div>\n\n\n\n<p>The <code>std::chrono::last<\/code> constant (line 1) lets me quickly determine how many days a month has. The output shows that 2012 is a leap year (line 2), but not 2013 (line 3).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1030\" height=\"533\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/sysDays-1030x533.png\" alt=\"\" class=\"wp-image-9431\" style=\"width:500px\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/sysDays-1030x533.png 1030w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/sysDays-300x155.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/sysDays-768x398.png 768w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/sysDays-705x365.png 705w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/sysDays.png 1313w\" sizes=\"auto, (max-width: 1030px) 100vw, 1030px\" \/><\/figure>\n\n\n\n<p>Suppose you have a calendar date like <code>year(2100)\/2\/29<\/code>. Your first question may be: Is this date valid?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Check if a Date is Valid<\/h2>\n\n\n\n<p>The various calendar types in C++20 have the function <code>ok<\/code>. This function returns <code>true<\/code> if the date is valid.<\/p>\n\n\n\n<!-- HTML generated using hilite.me --><div style=\"background: #f0f3f3; overflow:auto;width:auto;gray;border-width:.1em .1em .1em .8em\"><pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #0099FF; font-style: italic\">\/\/  leapYear.cpp<\/span>\n\n<span style=\"color: #009999\">#include &lt;chrono&gt;<\/span>\n<span style=\"color: #009999\">#include &lt;iostream&gt;<\/span>\n \n<span style=\"color: #007788; font-weight: bold\">int<\/span> <span style=\"color: #CC00FF\">main<\/span>() {\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> std<span style=\"color: #555555\">::<\/span>boolalpha <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;Valid days&quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;                         <span style=\"color: #0099FF; font-style: italic\">\/\/ (1)<\/span>\n    std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>day day31(<span style=\"color: #FF6600\">31<\/span>);\n    std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>day day32 <span style=\"color: #555555\">=<\/span> day31 <span style=\"color: #555555\">+<\/span> std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>days(<span style=\"color: #FF6600\">1<\/span>);\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  day31: &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> day31 <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;; &quot;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;day31.ok(): &quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> day31.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  day32: &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> day32 <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;; &quot;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;day32.ok(): &quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> day32.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n   \n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;Valid months&quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;                      <span style=\"color: #0099FF; font-style: italic\">\/\/ (2)<\/span>\n    std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>month month1(<span style=\"color: #FF6600\">1<\/span>);\n    std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>month month0(<span style=\"color: #FF6600\">0<\/span>);\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  month1: &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> month1 <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;; &quot;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;month1.ok(): &quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> month1.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  month0: &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> month0 <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;; &quot;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;month0.ok(): &quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> month0.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;Valid years&quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;                       <span style=\"color: #0099FF; font-style: italic\">\/\/ (3)<\/span>\n    std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year year2020(<span style=\"color: #FF6600\">2020<\/span>);\n    std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year year32768(<span style=\"color: #555555\">-<\/span><span style=\"color: #FF6600\">32768<\/span>);\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  year2020: &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> year2020 <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;; &quot;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;year2020.ok(): &quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> year2020.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  year32768: &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> year32768 <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;; &quot;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;year32768.ok(): &quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> year32768.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;Leap Years&quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;       \n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2016{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2016<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2020{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2020<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2024{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2024<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2016.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2016.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2020.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2020.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2024.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2024.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n     std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;No Leap Years&quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;   \n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2100{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2100<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2200{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2200<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2300{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2300<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2100.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2100.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2200.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2200.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2300.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2300.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;Leap Years&quot;<\/span>  <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;      \n\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2000{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2000<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2400{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2400<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n    constexpr <span style=\"color: #006699; font-weight: bold\">auto<\/span> leapYear2800{std<span style=\"color: #555555\">::<\/span>chrono<span style=\"color: #555555\">::<\/span>year(<span style=\"color: #FF6600\">2800<\/span>)<span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">2<\/span><span style=\"color: #555555\">\/<\/span><span style=\"color: #FF6600\">29<\/span>};\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2000.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2000.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2400.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2400.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&quot;  leapYear2800.ok(): &quot;<\/span> <span style=\"color: #555555\">&lt;&lt;<\/span> leapYear2800.ok() <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n    std<span style=\"color: #555555\">::<\/span>cout <span style=\"color: #555555\">&lt;&lt;<\/span> <span style=\"color: #CC3300\">&#39;\\n&#39;<\/span>;\n\n}\n<\/pre><\/div>\n\n\n\n<p>I check in the program if a given day (line 1), a given month (line 2), or a given year (line 3) is valid. The range of a day is [1, 31], of a month [1, 12], and a year [ -32767, 32767]. Consequently, the <code>ok()<\/code> calls on the corresponding values return <code>false<\/code>. Two facts are interesting when I display various values. First, if the value is not valid, the output shows: &#8220;is not a valid day&#8221;, &#8220;is not a valid month&#8221;, &#8220;is not a valid year&#8221;. Second, the values are displayed in string representation.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1030\" height=\"1002\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-1030x1002.png\" alt=\"\" class=\"wp-image-9444\" style=\"width:600px\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-1030x1002.png 1030w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-300x292.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-768x747.png 768w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-1536x1494.png 1536w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-36x36.png 36w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-1500x1459.png 1500w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1-705x686.png 705w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2024\/04\/leapYear-1.png 1687w\" sizes=\"auto, (max-width: 1030px) 100vw, 1030px\" \/><\/figure>\n\n\n\n<p>You can apply the <code>ok<\/code>-call on a calendar date. Now it&#8217;s pretty easy to check if a specific calendar date is a leap day and, therefore, the corresponding year a leap year. In the worldwide used<a href=\"https:\/\/en.wikipedia.org\/wiki\/Gregorian_calendar\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Gregorian_calendar\"> Gregorian calendar<\/a>, the following rules apply:<\/p>\n\n\n\n<p>Each year that is exactly divisible by <strong>4<\/strong> is a <strong>leap year<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Except for years that are exactly divisible by <strong>100<\/strong>. They are <strong>not leap years<\/strong>.<\/li>\n\n\n\n<li>Except for years that are exactly divisible by <strong>400<\/strong>. They are <strong>leap years<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Too complicated? The program<code> leapYears.cpp<\/code> exemplifies this rule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Next?<\/h2>\n\n\n\n<p>The extended chrono library makes it relatively easy to ask for the time duration between calendar dates.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I created calendar dates in my last post, &#8220;C++20: Creating Calendar Dates,&#8221; and I will display and check them today. This post is the fifth in my detailed journey through the chrono extension in C++20: Displaying Calendar Dates Thanks to std::chrono::local_days or std::chrono::sys_days, you can convert calendar dates to a local or a system std::chrono::time_point. [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":9316,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[375],"tags":[453],"class_list":["post-9421","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-20","tag-time"],"_links":{"self":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/9421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/comments?post=9421"}],"version-history":[{"count":19,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/9421\/revisions"}],"predecessor-version":[{"id":9446,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/9421\/revisions\/9446"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/9316"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=9421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=9421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=9421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}