{"id":2282,"date":"2016-10-31T11:53:42","date_gmt":"2016-10-31T09:53:42","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=2282"},"modified":"2016-11-07T05:13:18","modified_gmt":"2016-11-07T03:13:18","slug":"a-better-date-and-time-c-library","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/","title":{"rendered":"A better date and time C++ library"},"content":{"rendered":"<p>C++11 added a date and time utility library called <em>chrono<\/em>, available in namespace <tt>std::chrono<\/tt> and header <tt>&lt;chrono&gt;<\/tt>. The problem with it is that the library is a general purpose one and therefore lacks many useful features, such as working with dates, weeks, calendars, timezones and other related features. Fortunately, a rich date and time library based on chrono has been created by Howard Hinnant and is <a href=\"https:\/\/github.com\/HowardHinnant\/date\">available on github<\/a>. The library is called <em>date<\/em> and is actually a collection of several small libraries:<\/p>\n<ul>\n<li><em>date<\/em>: the main library, available in header <tt>date.h<\/tt>, defines new date and time classes and operations with them. All the other libraries are based on this one.<\/li>\n<li><em>timezones<\/em>: a library for timezones, available in files <tt>tz.h<\/tt>\/<tt>tz.cpp<\/tt>, based on the IANA timezone database<\/li>\n<li><em>chrono_io<\/em>: a library for streaming durations, available in header <tt>chrono_io.h<\/tt><\/li>\n<li><em>iso_week<\/em>: a library that implements the ISO week calendar, available in header <tt>iso_week.h<\/tt><\/li>\n<li><em>julian<\/em> and <em>islamic<\/em>: libraries that implement the Julian and Islamic calendars, available in headers <tt>julian.h<\/tt> and <tt>islamic.h<\/tt><\/li>\n<\/ul>\n<p>You can find all the necessary documentation on github. Here are several links:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/HowardHinnant\/date\">Library table of content<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/HowardHinnant\/date\/wiki\/Examples-and-Recipes#time_point_to_components\">Examples and Recipes<\/a><\/li>\n<li><a href=\"https:\/\/howardhinnant.github.io\/date\/date.html\">date documentation<\/a><\/li>\n<li><a href=\"https:\/\/howardhinnant.github.io\/date\/iso_week.html\">iso_week documentation<\/a><\/li>\n<\/ul>\n<p>In this article we will look at some examples for working with dates and ISO weeks. This library introduces many new types to handle various date and time representations. Among these we will look at:<\/p>\n<ul>\n<li><tt>sys_days<\/tt>: A count of days since <tt>std::system_clock<\/tt>&#8216;s epoch. This is a <tt>time_point<\/tt> with a resolution of a day, and is implicitly convertible to <tt>std::system_clock::time_point<\/tt>, that has a much smaller resolution (millisecond or nanosecond), but not the other way around. To go the other way you must use <tt>floor()<\/tt>.<\/li>\n<li><tt>year_month_day<\/tt>: A type that holds a day with fields for year, month (1 to 12) and day (1 to 31).<\/li>\n<li><tt>year_month_weekday<\/tt>: A type that holds a day with fields for year, month (1 to 12), a day of the week (0 to 6), and an index in the range [1, 5] that indicates the number of the week in the month.<\/li>\n<li><tt>year_weeknum_weekday<\/tt>: A type that hold a year, a weeknum (1 to 53) and a weekday (0 to 6). This can convert implicitly to and from a <tt>sys_days<\/tt>.<\/li>\n<\/ul>\n<p>For using the library we need the following:<\/p>\n<ul>\n<li>include header <tt>date.h<\/tt> and namespaces <tt>date<\/tt> and <tt>date::literals<\/tt><\/li>\n<li>for iso weeks we also need header <tt>iso_week.h<\/tt> and namespaces <tt>iso_week<\/tt> and <tt>iso_week::literals<\/tt><\/li>\n<\/li>\n<li><strong>NOTICE<\/strong>: The namespaces <tt>date::literals<\/tt> and <tt>iso_week::literals<\/tt> define types and literal operators with the same name and therefore can lead to name collisions; therefore you should only include them in the scope where you need them.<\/li>\n<\/ul>\n<p>We will use the following lambda expression to print various dates to the console:<\/p>\n<pre class=\"lang:c++ decode:true \" >auto lprintdate = [](auto const &amp; d) {std::cout &lt;&lt; d &lt;&lt; std::endl; };<\/pre>\n<p>NOTICE: All the &#8216;today&#8217; and related dates below are based on 2016-10-31.<\/p>\n<p>Let us look at some examples:<\/p>\n<ul>\n<li>create <tt>sys_days<\/tt> objects (including literals):\n<pre class=\"lang:c++ decode:true \" >sys_days d1 = 2016_y \/ oct \/ 29;\r\nsys_days d2 = 29_d \/ oct \/ 2016;\r\nsys_days d3 = oct \/ 29 \/ 2016;\r\nauto today = floor&lt;days&gt;(system_clock::now());\r\n\r\nlprintdate(d1);      \/\/ 2016-10-29\r\nlprintdate(d2);      \/\/ 2016-10-29\r\nlprintdate(d3);      \/\/ 2016-10-29\r\nlprintdate(today);   \/\/ 2016-10-31<\/pre>\n<\/li>\n<li>create <tt>year_month_day<\/tt> objects (including literals):\n<pre class=\"lang:c++ decode:true \" >year_month_day d1 = 2016_y \/ oct \/ 29;\r\nyear_month_day d2 = 29_d \/ oct \/ 2016;\r\nyear_month_day d3 = oct \/ 29 \/ 2016;\r\nyear_month_day today = floor&lt;days&gt;(system_clock::now());\r\n\r\nlprintdate(d1);      \/\/ 2016-10-29\r\nlprintdate(d2);      \/\/ 2016-10-29\r\nlprintdate(d3);      \/\/ 2016-10-29\r\nlprintdate(today);   \/\/ 2016-10-31<\/pre>\n<\/li>\n<li>creating <tt>year_month_weekday<\/tt> literals and converting to <tt>year_month_day<\/tt>\n<pre class=\"lang:c++ decode:true \" >auto wd1 = 2016_y \/ oct \/ mon[1];\r\nauto wd2 = mon[1] \/ oct \/ 2016;\r\nauto wd3 = oct \/ mon[1] \/ 2016;\r\n\r\nlprintdate(wd1);     \/\/ 2016\/Oct\/Mon[1]\r\nlprintdate(wd2);     \/\/ 2016\/Oct\/Mon[1]\r\nlprintdate(wd3);     \/\/ 2016\/Oct\/Mon[1]\r\n\r\nauto d1 = year_month_day{ wd1 };\r\nauto d2 = year_month_day{ wd2 };\r\nauto d3 = year_month_day{ wd2 };\r\n\r\nlprintdate(d1);      \/\/ 2016-10-03\r\nlprintdate(d2);      \/\/ 2016-10-03\r\nlprintdate(d3);      \/\/ 2016-10-03<\/pre>\n<\/li>\n<li>create <tt>year_month_day<\/tt> values for today, yesterday and tomorrow\n<pre class=\"lang:c++ decode:true \" >auto today = floor&lt;days&gt;(system_clock::now());\r\nauto tomorrow = today + days{ 1 };\r\nauto yesterday = today - days{ 1 };\r\n\r\nlprintdate(yesterday);  \/\/ 2016-10-30\r\nlprintdate(today);      \/\/ 2016-10-31\r\nlprintdate(tomorrow);   \/\/ 2016-11-01<\/pre>\n<\/li>\n<li>create <tt>year_month_day<\/tt> values for first and last day of the month\n<pre class=\"lang:c++ decode:true \" >auto today = year_month_day{ floor&lt;days&gt;(system_clock::now()) };\r\nauto first_day_this_month = year_month_day{ today.year(), today.month(), day{ 1 } };\r\nlprintdate(first_day_this_month);\/\/ 2016-10-01\r\n\r\nauto d1 = year_month_day_last(today.year(), month_day_last{ today.month() });\r\nauto last_day_this_month = year_month_day{ d1 };\r\nlprintdate(last_day_this_month); \/\/ 2016-10-31\r\n\r\nauto d2 = year_month_day_last(year{ 2016 }, month_day_last{ month{ 2 } });\r\nauto last_day_feb = year_month_day{ d2 };\r\nlprintdate(last_day_feb);        \/\/ 2016-02-29<\/pre>\n<p>Update: The following, as indicated by Howard Hinnant in the comments, can also be used:<\/p>\n<pre class=\"lang:c++ decode:true \" >year_month_day first_day_this_month = today.year()\/today.month()\/1;\r\nyear_month_day last_day_this_month = today.year()\/today.month()\/last;<\/pre>\n<\/li>\n<li>create <tt>iso_week<\/tt> literals\n<pre class=\"lang:c++ decode:true \" >auto isod1 = 2016_y \/ 42 \/ mon;\r\nauto isod2 = 42_w \/ mon \/ 2016_y;\r\nauto isod3 = mon \/ 42_w \/ 2016_y;\r\n\r\nlprintdate(isod1);  \/\/ 2016-W44-Mon\r\nlprintdate(isod2);  \/\/ 2016-W44-Mon\r\nlprintdate(isod3);  \/\/ 2016-W44-Mon<\/pre>\n<\/li>\n<li>get the iso week number for today\n<pre class=\"lang:c++ decode:true \" >auto today = floor&lt;days&gt;(system_clock::now());\r\nauto today_iso = year_weeknum_weekday{ today };\r\n\r\nlprintdate(today_iso);  \/\/ 2016-W44-Mon\r\nstd::cout &lt;&lt; \"week \" &lt;&lt; (unsigned)today_iso.weeknum() &lt;&lt; std::endl; \/\/44<\/pre>\n<\/li>\n<\/ul>\n<p>We will look at more utilities and examples in another post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C++11 added a date and time utility library called chrono, available in namespace std::chrono and header &lt;chrono&gt;. The problem with it is that the library is a general purpose one and therefore lacks many useful features, such as working with dates, weeks, calendars, timezones and other related features. Fortunately, a rich date and time library &#8230; <a title=\"A better date and time C++ library\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/\" aria-label=\"Read more about A better date and time C++ library\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[451,488,489,491,370,138,490],"class_list":["post-2282","post","type-post","status-publish","format-standard","hentry","category-c","tag-c","tag-chrono","tag-date","tag-github","tag-iso","tag-library","tag-time"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"c++,chrono,date,github,iso,library,time\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"A better date and time C++ library\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-10-31T09:53:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2016-11-07T03:13:18+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"A better date and time C++ library\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#article\",\"name\":\"A better date and time C++ library\",\"headline\":\"A better date and time C++ library\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2016-10-31T11:53:42+02:00\",\"dateModified\":\"2016-11-07T05:13:18+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":8,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#webpage\"},\"articleSection\":\"C++, C++, chrono, date, github, iso, library, time\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#listItem\",\"name\":\"A better date and time C++ library\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#listItem\",\"position\":5,\"name\":\"A better date and time C++ library\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/\",\"name\":\"A better date and time C++ library\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/10\\\/31\\\/a-better-date-and-time-c-library\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2016-10-31T11:53:42+02:00\",\"dateModified\":\"2016-11-07T05:13:18+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"A better date and time C++ library","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/","robots":"max-image-preview:large","keywords":"c++,chrono,date,github,iso,library,time","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#article","name":"A better date and time C++ library","headline":"A better date and time C++ library","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2016-10-31T11:53:42+02:00","dateModified":"2016-11-07T05:13:18+02:00","inLanguage":"en-US","commentCount":8,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#webpage"},"articleSection":"C++, C++, chrono, date, github, iso, library, time"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#listItem","name":"A better date and time C++ library"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#listItem","position":5,"name":"A better date and time C++ library","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/","name":"A better date and time C++ library","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2016-10-31T11:53:42+02:00","dateModified":"2016-11-07T05:13:18+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"A better date and time C++ library","og:url":"https:\/\/mariusbancila.ro\/blog\/2016\/10\/31\/a-better-date-and-time-c-library\/","article:published_time":"2016-10-31T09:53:42+00:00","article:modified_time":"2016-11-07T03:13:18+00:00","twitter:card":"summary","twitter:title":"A better date and time C++ library"},"aioseo_meta_data":{"post_id":"2282","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:07:10","updated":"2025-12-12 07:43:26","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":8,"uagb_excerpt":"C++11 added a date and time utility library called chrono, available in namespace std::chrono and header &lt;chrono&gt;. The problem with it is that the library is a general purpose one and therefore lacks many useful features, such as working with dates, weeks, calendars, timezones and other related features. Fortunately, a rich date and time library&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">chrono<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">date<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">github<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">iso<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">library<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">time<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">chrono<\/span>","<span class=\"advgb-post-tax-term\">date<\/span>","<span class=\"advgb-post-tax-term\">github<\/span>","<span class=\"advgb-post-tax-term\">iso<\/span>","<span class=\"advgb-post-tax-term\">library<\/span>","<span class=\"advgb-post-tax-term\">time<\/span>"]}},"comment_count":"8","relative_dates":{"created":"Posted 10 years ago","modified":"Updated 10 years ago"},"absolute_dates":{"created":"Posted on October 31, 2016","modified":"Updated on November 7, 2016"},"absolute_dates_time":{"created":"Posted on October 31, 2016 11:53 am","modified":"Updated on November 7, 2016 5:13 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-AO","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/2282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=2282"}],"version-history":[{"count":9,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/2282\/revisions"}],"predecessor-version":[{"id":2291,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/2282\/revisions\/2291"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=2282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=2282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=2282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}