{"id":6015,"date":"2020-10-18T15:59:49","date_gmt":"2020-10-18T15:59:49","guid":{"rendered":"https:\/\/www.modernescpp.com\/index.php\/calendar-and-time-zone-in-c-20-working-with-calendar-dates\/"},"modified":"2023-06-26T09:37:36","modified_gmt":"2023-06-26T09:37:36","slug":"calendar-and-time-zone-in-c-20-working-with-calendar-dates","status":"publish","type":"post","link":"https:\/\/www.modernescpp.com\/index.php\/calendar-and-time-zone-in-c-20-working-with-calendar-dates\/","title":{"rendered":"Calendar and Time-Zones in C++20: Handling Calendar Dates"},"content":{"rendered":"<p>In my last post, &#8220;Calendar and Time Zone in C++20: Calendar Dates&#8221;, I presented the new calendar-related data types. Today, I go one step further and interact with them.<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-5945\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/07\/TimelineCpp20CoreLanguage.png\" alt=\"TimelineCpp20CoreLanguage\" width=\"650\" height=\"278\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/07\/TimelineCpp20CoreLanguage.png 950w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/07\/TimelineCpp20CoreLanguage-300x128.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/07\/TimelineCpp20CoreLanguage-768x327.png 768w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/p>\n<p>Assume you have a calendar date, such as <code>year(2100)\/2\/29. <\/code>Your first question may be: Is this date valid?<\/p>\n<h2>Check if a Date is Valid<\/h2>\n<p>The various calendar types in C++20 have a function <code>ok<\/code>. This function returns <code>true<\/code> if the date is valid.<\/p>\n<p>&nbsp;<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f0f3f3; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #0099ff; font-style: italic;\">\/\/  leapYear.cpp<\/span>\r\n\r\n<span style=\"color: #009999;\">#include &lt;iostream&gt;<\/span>\r\n<span style=\"color: #009999;\">#include \"date.h\"<\/span>\r\n \r\n<span style=\"color: #007788; font-weight: bold;\">int<\/span> <span style=\"color: #cc00ff;\">main<\/span>() {\r\n\r\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> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    \r\n    <span style=\"color: #006699; font-weight: bold;\">using<\/span> <span style=\"color: #006699; font-weight: bold;\">namespace<\/span> date; \r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Valid days\"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;         <span style=\"color: #0099ff; font-style: italic;\">\/\/ (1)<\/span>       \r\n    day day31(<span style=\"color: #ff6600;\">31<\/span>);\r\n    day day32 <span style=\"color: #555555;\">=<\/span> day31 <span style=\"color: #555555;\">+<\/span> days(<span style=\"color: #ff6600;\">1<\/span>);\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  day31: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> day31 <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"; \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"                   day31.ok(): \"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> day31.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  day32: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> day32 <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"; \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"day32.ok(): \"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> day32.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n   \r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Valid months\"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;       <span style=\"color: #0099ff; font-style: italic;\">\/\/ (2)<\/span> \r\n    month month1(<span style=\"color: #ff6600;\">1<\/span>);\r\n    month month0(<span style=\"color: #ff6600;\">0<\/span>);\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  month1: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> month1 <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"; \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"                   month1.ok(): \"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> month1.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  month0: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> month0 <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"; \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"month0.ok(): \"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> month0.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Valid years\"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;       <span style=\"color: #0099ff; font-style: italic;\">\/\/ (3)<\/span> \r\n    year year2020(<span style=\"color: #ff6600;\">2020<\/span>);\r\n    year year32768(<span style=\"color: #555555;\">-<\/span><span style=\"color: #ff6600;\">32768<\/span>);\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  year2020: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> year2020 <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"; \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"                       year2020.ok(): \"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> year2020.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  year32768: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> year32768 <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"; \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"year32768.ok(): \"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> year32768.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Leap Years\"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;       <span style=\"color: #0099ff; font-style: italic;\">\/\/ (4)<\/span> \r\n\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2016{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>};\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2020{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>};\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2024{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>};\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2016.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2016.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2020.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2020.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2024.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2024.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n     std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"No Leap Years\"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;   <span style=\"color: #0099ff; font-style: italic;\">\/\/ (5)<\/span> \r\n\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2100{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>};\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2200{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>};\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2300{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>};\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2100.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2100.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2200.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2200.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2300.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2300.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Leap Years\"<\/span>  <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;      <span style=\"color: #0099ff; font-style: italic;\">\/\/ (6)<\/span> \r\n\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2000{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>};\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2400{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>};\r\n    constexpr <span style=\"color: #006699; font-weight: bold;\">auto<\/span> leapYear2800{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>};\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2000.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2000.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2400.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2400.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  leapYear2800.ok(): \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> leapYear2800.ok() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>I checked 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 of a year [ -32767, 32767]. Consequently, the<code> ok<\/code>-call on the corresponding values returns <code>false<\/code>. Two facts are interesting when I output the various values. First, if the value is not valid, the output displays: <code>\"is not a valid day<\/code>&#8220;; <code>\"is not a valid month<\/code>&#8220;; <code>\"is not a valid year<\/code>&#8220;. Second, month values are displayed in string representation.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6012\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/leapYears.png\" alt=\"leapYears\" width=\"650\" height=\"643\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/leapYears.png 782w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/leapYears-300x297.png 300w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/leapYears-768x760.png 768w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/p>\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\">Gregorian calendar<\/a>, the following rules apply:<\/p>\n<p>Each year that is exactly divisible by <strong>4<\/strong> is a <strong>leap yea<\/strong>r.<\/p>\n<ul>\n<li>Except for years that are exactly divisible by <strong>100<\/strong>. They are <strong>no leap years<\/strong>.\n<ul>\n<li>Except for years that are exactly divisible by <strong>400<\/strong>. They are <strong>leap years<\/strong>.<\/li>\n<\/ul>\n<div>&nbsp;<\/div>\n<\/li>\n<\/ul>\n<p>Too complicate? The program <span style=\"font-family: courier new, courier;\">leapYears.cpp<\/span> exemplifies this rule.<\/p>\n<p>The extended chrono library makes it quite comfortable to ask for the duration between calendar dates.<\/p>\n<\/p>\n<h2>Query Calendar Dates<\/h2>\n<p>Without further ado. The following program queries a few calendar dates.<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f0f3f3; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #0099ff; font-style: italic;\">\/\/ queryCalendarDates.cpp<\/span>\r\n\r\n<span style=\"color: #009999;\">#include \"date.h\"<\/span>\r\n<span style=\"color: #009999;\">#include &lt;iostream&gt;<\/span>\r\n\r\n<span style=\"color: #007788; font-weight: bold;\">int<\/span> <span style=\"color: #cc00ff;\">main<\/span>() {\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">using<\/span> <span style=\"color: #006699; font-weight: bold;\">namespace<\/span> date;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> now <span style=\"color: #555555;\">=<\/span> std<span style=\"color: #555555;\">::<\/span>chrono<span style=\"color: #555555;\">::<\/span>system_clock<span style=\"color: #555555;\">::<\/span>now();              <span style=\"color: #0099ff; font-style: italic;\">\/\/ (1)<\/span>\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current time is: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> now <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\" UTC<\/span><span style=\"color: #cc3300; font-weight: bold;\">\\n<\/span><span style=\"color: #cc3300;\">\"<\/span>;       <span style=\"color: #0099ff; font-style: italic;\"><\/span>\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current date is: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(now) <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current date is: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> year_month_day{floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(now)} <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current date is: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> year_month_weekday{floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(now)} <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    \r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> currentDate <span style=\"color: #555555;\">=<\/span> year_month_day(floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(now));       <span style=\"color: #0099ff; font-style: italic;\">\/\/ (2)<\/span>\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> currentYear <span style=\"color: #555555;\">=<\/span> currentDate.year();\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current year is \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> currentYear <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">'\\n'<\/span>;    \r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> currentMonth <span style=\"color: #555555;\">=<\/span> currentDate.month();\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current month is \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> currentMonth <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">'\\n'<\/span>; \r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> currentDay <span style=\"color: #555555;\">=<\/span> currentDate.day();\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"The current day is \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> currentDay <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">'\\n'<\/span>; \r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n                                                               <span style=\"color: #0099ff; font-style: italic;\">\/\/ (3)<\/span>\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> hAfter <span style=\"color: #555555;\">=<\/span> floor<span style=\"color: #555555;\">&lt;<\/span>std<span style=\"color: #555555;\">::<\/span>chrono<span style=\"color: #555555;\">::<\/span>hours<span style=\"color: #555555;\">&gt;<\/span>(now) <span style=\"color: #555555;\">-<\/span> sys_days(January<span style=\"color: #555555;\">\/<\/span><span style=\"color: #ff6600;\">1<\/span><span style=\"color: #555555;\">\/<\/span>currentYear); \r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"It has been \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> hAfter <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\" since New Year!<\/span><span style=\"color: #cc3300; font-weight: bold;\">\\n<\/span><span style=\"color: #cc3300;\">\"<\/span>;  \r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> nextYear <span style=\"color: #555555;\">=<\/span> currentDate.year() <span style=\"color: #555555;\">+<\/span> years(<span style=\"color: #ff6600;\">1<\/span>);             <span style=\"color: #0099ff; font-style: italic;\">\/\/ (4)<\/span>\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> nextNewYear <span style=\"color: #555555;\">=<\/span> sys_days(January<span style=\"color: #555555;\">\/<\/span><span style=\"color: #ff6600;\">1<\/span><span style=\"color: #555555;\">\/<\/span>nextYear);\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> hBefore <span style=\"color: #555555;\">=<\/span>  sys_days(January<span style=\"color: #555555;\">\/<\/span><span style=\"color: #ff6600;\">1<\/span><span style=\"color: #555555;\">\/<\/span>nextYear) <span style=\"color: #555555;\">-<\/span> floor<span style=\"color: #555555;\">&lt;<\/span>std<span style=\"color: #555555;\">::<\/span>chrono<span style=\"color: #555555;\">::<\/span>hours<span style=\"color: #555555;\">&gt;<\/span>(now); \r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"It is \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> hBefore <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\" before New Year!<\/span><span style=\"color: #cc3300; font-weight: bold;\">\\n<\/span><span style=\"color: #cc3300;\">\"<\/span>;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n                                                               <span style=\"color: #0099ff; font-style: italic;\">\/\/ (5)<\/span>\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"It has been \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(hAfter) <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\" since New Year!<\/span><span style=\"color: #cc3300; font-weight: bold;\">\\n<\/span><span style=\"color: #cc3300;\">\"<\/span>;    \r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"It is \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(hBefore) <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\" before New Year!<\/span><span style=\"color: #cc3300; font-weight: bold;\">\\n<\/span><span style=\"color: #cc3300;\">\"<\/span>;\r\n    \r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    \r\n}\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>With the C++20 extension, you can directly display a time point, such as now (line 1). <code>std::chrono::floor<\/code> allows it to convert the time point to a day <code>std::chrono::sys_days<\/code>. This value can be used to initialize the calendar type<code> std::chrono::year_month_day<\/code>. Finally, when I put the value into a <code>std::chrono::year_month_weekday<\/code> calendar type, I get the answer that this day is the 3rd Tuesday in October.<\/p>\n<p>Of course, I can also ask for a calendar date for its components, such as the current year, month, or day (line 2).<\/p>\n<p>Line (3) is the most interesting one. When subtracting from the current date in the hour&#8217;s resolution first January of the current year, I get the hour since the new year. On the contrary: When I subtract from the first January of the following year (line 4) the current date in hours resolution, I get the hours to the new year. Maybe you don&#8217;t like the hour&#8217;s resolution. Line 5 displays the values in days resolution.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6013\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/queryCalendarDates.png\" alt=\"queryCalendarDates\" width=\"500\" height=\"451\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/queryCalendarDates.png 611w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/queryCalendarDates-300x271.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<p>I want to know the weekdays of my birthdays.<\/p>\n<h2><code>Query Weekdays<\/code><\/h2>\n<p>Thanks to the extended chrono library, getting the weekday of a given calendar date is pretty easy.<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f0f3f3; overflow: auto; width: auto; gray;border-width: .1em .1em .1em .8em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #0099ff; font-style: italic;\">\/\/ weekdaysOfBirthdays.cpp<\/span>\r\n\r\n<span style=\"color: #009999;\">#include &lt;cstdlib&gt;<\/span>\r\n<span style=\"color: #009999;\">#include &lt;iostream&gt;<\/span>\r\n<span style=\"color: #009999;\">#include \"date.h\"<\/span>\r\n\r\n<span style=\"color: #007788; font-weight: bold;\">int<\/span> <span style=\"color: #cc00ff;\">main<\/span>() {\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">using<\/span> <span style=\"color: #006699; font-weight: bold;\">namespace<\/span> date;\r\n\r\n    <span style=\"color: #007788; font-weight: bold;\">int<\/span> y;\r\n    <span style=\"color: #007788; font-weight: bold;\">int<\/span> m;\r\n    <span style=\"color: #007788; font-weight: bold;\">int<\/span> d;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Year: \"<\/span>;                          <span style=\"color: #0099ff; font-style: italic;\">\/\/ (1)<\/span>\r\n    std<span style=\"color: #555555;\">::<\/span>cin <span style=\"color: #555555;\">&gt;&gt;<\/span> y;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Month: \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cin <span style=\"color: #555555;\">&gt;&gt;<\/span> m;\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Day: \"<\/span>;\r\n    std<span style=\"color: #555555;\">::<\/span>cin <span style=\"color: #555555;\">&gt;&gt;<\/span> d;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> birthday <span style=\"color: #555555;\">=<\/span> year(y)<span style=\"color: #555555;\">\/<\/span>month(m)<span style=\"color: #555555;\">\/<\/span>day(d);       <span style=\"color: #0099ff; font-style: italic;\">\/\/ (2)<\/span>\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">if<\/span> (not birthday.ok()) {                       <span style=\"color: #0099ff; font-style: italic;\">\/\/ (3)<\/span>\r\n        std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> birthday <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n        std<span style=\"color: #555555;\">::<\/span>exit(EXIT_FAILURE);\r\n    }\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Birthday: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> birthday <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> birthdayWeekday <span style=\"color: #555555;\">=<\/span> year_month_weekday(birthday);    <span style=\"color: #0099ff; font-style: italic;\">\/\/ (4)<\/span>\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Weekday of birthday: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> birthdayWeekday.weekday() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> currentDate <span style=\"color: #555555;\">=<\/span> year_month_day(floor<span style=\"color: #555555;\">&lt;<\/span>days<span style=\"color: #555555;\">&gt;<\/span>(std<span style=\"color: #555555;\">::<\/span>chrono<span style=\"color: #555555;\">::<\/span>system_clock<span style=\"color: #555555;\">::<\/span>now()));  \r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> currentYear <span style=\"color: #555555;\">=<\/span> currentDate.year();\r\n    \r\n    <span style=\"color: #006699; font-weight: bold;\">auto<\/span> age <span style=\"color: #555555;\">=<\/span> (<span style=\"color: #007788; font-weight: bold;\">int<\/span>)currentDate.year() <span style=\"color: #555555;\">-<\/span> (<span style=\"color: #007788; font-weight: bold;\">int<\/span>)birthday.year();  <span style=\"color: #0099ff; font-style: italic;\">\/\/ (5)<\/span>\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Your age: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> age <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"Weekdays for your next 10 birthdays\"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;  <span style=\"color: #0099ff; font-style: italic;\">\/\/ (6)<\/span>\r\n\r\n    <span style=\"color: #006699; font-weight: bold;\">for<\/span> (<span style=\"color: #007788; font-weight: bold;\">int<\/span> i <span style=\"color: #555555;\">=<\/span> <span style=\"color: #ff6600;\">1<\/span>, newYear <span style=\"color: #555555;\">=<\/span> (<span style=\"color: #007788; font-weight: bold;\">int<\/span>)currentYear; i <span style=\"color: #555555;\">&lt;=<\/span> <span style=\"color: #ff6600;\">10<\/span>;  <span style=\"color: #555555;\">++<\/span>i ) {  \r\n        std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"  Age \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span>  <span style=\"color: #555555;\">++<\/span>age <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n        <span style=\"color: #006699; font-weight: bold;\">auto<\/span> newBirthday <span style=\"color: #555555;\">=<\/span> year(<span style=\"color: #555555;\">++<\/span>newYear)<span style=\"color: #555555;\">\/<\/span>month(m)<span style=\"color: #555555;\">\/<\/span>day(d);\r\n        std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"    Birthday: \"<\/span> <span style=\"color: #555555;\">&lt;&lt;<\/span> newBirthday <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n        std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> <span style=\"color: #cc3300;\">\"    Weekday of birthday: \"<\/span> \r\n                  <span style=\"color: #555555;\">&lt;&lt;<\/span> year_month_weekday(newBirthday).weekday() <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n    }\r\n\r\n    std<span style=\"color: #555555;\">::<\/span>cout <span style=\"color: #555555;\">&lt;&lt;<\/span> std<span style=\"color: #555555;\">::<\/span>endl;\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>First, the program asks you for the year, month, and day of your birthday (line 1). Based on the input, a calendar date is created (line 2) and checked for validity (line 3). Now I display the weekday of your birthday. I use, therefore, the calendar date to fill the calendar type <code>std::chrono::year_month_weekday<\/code> (line 4). To get the <code>int<\/code> representation of the calendar-type year, I have to convert it to <code>int<\/code> (line 5). Now I can display your age. Finally, the for-loop displays the following information for each of your next ten birthdays (line 6): your age, the calendar date, and the weekday. I only have to increment the <code>age<\/code> and <code>newYear<\/code> variable.<\/p>\n<p>Here is a run of the program with my birthday.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-6014\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/weekdaysOfBirthdays.png\" alt=\"weekdaysOfBirthdays\" width=\"500\" height=\"881\" style=\"display: block; margin-left: auto; margin-right: auto;\" srcset=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/weekdaysOfBirthdays.png 585w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/weekdaysOfBirthdays-170x300.png 170w, https:\/\/www.modernescpp.com\/wp-content\/uploads\/2020\/10\/weekdaysOfBirthdays-581x1024.png 581w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<h2>What&#8217;s next?<\/h2>\n<p>A critical component in my posts to the extended Chrono library is still missing: time zones.<\/p>\n<p>&nbsp;<\/p>\n<\/p>\n<p>&nbsp;<\/p>\n<div id=\"simple-translate\">&nbsp;<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In my last post, &#8220;Calendar and Time Zone in C++20: Calendar Dates&#8221;, I presented the new calendar-related data types. Today, I go one step further and interact with them.<\/p>\n","protected":false},"author":21,"featured_media":5945,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[375],"tags":[453],"class_list":["post-6015","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\/6015","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=6015"}],"version-history":[{"count":1,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6015\/revisions"}],"predecessor-version":[{"id":6723,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/posts\/6015\/revisions\/6723"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media\/5945"}],"wp:attachment":[{"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/media?parent=6015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/categories?post=6015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.modernescpp.com\/index.php\/wp-json\/wp\/v2\/tags?post=6015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}