diff --git a/Examples-and-Recipes.md b/Examples-and-Recipes.md index 16a9896..74c549d 100644 --- a/Examples-and-Recipes.md +++ b/Examples-and-Recipes.md @@ -29,7 +29,7 @@ int y=2015, m=7, d=30, h=12, min=34, s=56; auto ymd = year(y)/m/d; // Yields a year_month_day type if (!ymd.ok()) throw std::runtime_error("Invalid date"); -system_clock::time_point = day_point(ymd) + +system_clock::time_point tp = sys_days(ymd) + hours(h) + minutes(min) + seconds(s); ``` @@ -47,7 +47,7 @@ void to_time_point(const std::tm& t, auto ymd = year(y)/(t.tm_mon+1)/t.tm_mday; // Yields a year_month_day type if (!ymd.ok()) throw std::runtime_error("Invalid date"); - tp = day_point(ymd) + + tp = sys_days(ymd) + hours(t.tm_hour) + minutes(t.tm_min) + seconds(t.tm_sec); } @@ -87,10 +87,9 @@ std::tm to_calendar_time(std::chrono::time_point tp) auto ymd = year_month_day(date); auto weekday = year_month_weekday(date).weekday_indexed().weekday(); auto tod = make_time(tp - date); - days daysSinceJan1 = date - day_point(ymd.year()/1/1); + days daysSinceJan1 = date - sys_days(ymd.year()/1/1); - std::tm result; - std::memset(&result, 0, sizeof(result)); + std::tm result{}; result.tm_sec = tod.seconds().count(); result.tm_min = tod.minutes().count(); result.tm_hour = tod.hours().count(); @@ -119,7 +118,7 @@ The following function will "normalize" a `year_month_day`, much like `mktime` n { using namespace date; ymd += months{0}; - ymd = day_point(ymd); + ymd = sys_days{ymd}; return ymd; } @@ -127,11 +126,11 @@ The first line simply adds 0 months to the `ymd`. If `ymd.month()` is 0, this w The second line will "normalize" the day field. The second line requires that the month field is already normalized. For example `2015_y/dec/32` will become `2016_y/jan/1`. If the day field is already in range, there will be no change. -The conversion from `year_month_day` to `day_point` calls this algorithm: +The conversion from `year_month_day` to `sys_days` calls this algorithm: http://howardhinnant.github.io/date_algorithms.html#days_from_civil -And the conversion from `day_point` back to `year_month_day` calls this algorithm: +And the conversion from `sys_days` back to `year_month_day` calls this algorithm: http://howardhinnant.github.io/date_algorithms.html#civil_from_days @@ -145,7 +144,7 @@ Example: std::cout << ymd << (ymd.ok() ? "\n" : " invalid date\n"); ymd += months{0}; std::cout << ymd << (ymd.ok() ? "\n" : " invalid date\n"); - ymd = day_point(ymd); + ymd = sys_days{ymd}; std::cout << ymd << (ymd.ok() ? "\n" : " invalid date\n"); } @@ -181,10 +180,10 @@ Here is a function to perform that conversion: { using namespace date; using namespace std::chrono; - auto utc = utc_clock::sys_to_utc(day_point{y/jan/1}) + us; + auto utc = utc_clock::sys_to_utc(sys_days{y/jan/1}) + us; auto sys = utc_clock::utc_to_sys(utc); auto dp = floor(sys); - auto d = dp - day_point{1958_y/jan/1}; + auto d = dp - sys_days{1958_y/jan/1}; us = utc - utc_clock::sys_to_utc(dp); auto ms = duration_cast(us); us -= ms; @@ -226,12 +225,12 @@ This creates two `year_month` objects and subtracts them. This gives a `std::ch 36 -To include the influence of the day-fields, it is best to convert `d1` and `d2` to `day_point`s: +To include the influence of the day-fields, it is best to convert `d1` and `d2` to `sys_days `s: - auto dp1 = day_point(d1); - auto dp2 = day_point(d2); + auto dp1 = sys_days(d1); + auto dp2 = sys_days(d2); -Now we could (for example) subtract the two `day_point`s, and round the result to the nearest integral month: +Now we could (for example) subtract the two `sys_days `s, and round the result to the nearest integral month: std::cout << round(dp2-dp1).count() << '\n'; @@ -260,11 +259,11 @@ The [ISO week date](https://en.wikipedia.org/wiki/ISO_week_date) is an internati Like ``, you can specify an ISO week date in any of the three orders: y/wn/wd, wd/wn/y, wn/wd/y (big endian, little endian, mixed (american) endian). -Also like ``, you can implicitly convert a ISO week date to `day_point`, and vice-versa. For convenience, an alias of `date::day_point` exists as `iso_week::day_point`: +Also like ``, you can implicitly convert a ISO week date to `sys_days `, and vice-versa. For convenience, an alias of `date:: sys_days ` exists as `iso_week:: sys_days `: - iso_week::day_point dp = iso_date; + iso_week:: sys_days dp = iso_date; -And recall that `day_point` is just a type alias for a `std::chrono::time_point`. So the ISO week date (`iso_week:year_weeknum_weekday`) is immediately interoperable with the entire `` library, just like `date::year_month_day` is. +And recall that `sys_days ` is just a type alias for a `std::chrono::time_point`. So the ISO week date (`iso_week:year_weeknum_weekday`) is immediately interoperable with the entire `` library, just like `date::year_month_day` is. auto now = std::chrono::system_clock::now(); auto dp = date::floor(now); @@ -276,7 +275,7 @@ Which just output for me: 2016-W11-Sat 03:07:02.460737 -And because `iso_week:year_weeknum_weekday` is implicitly convertible to and from `day_point`, that makes it immediately (and explicitly) convertible to any other calendar system that is implicitly convertible to and from `day_point`: +And because `iso_week:year_weeknum_weekday` is implicitly convertible to and from `sys_days `, that makes it immediately (and explicitly) convertible to any other calendar system that is implicitly convertible to and from `sys_days `: auto civil_date = date::year_month_day{iso_date}; std::cout << civil_date << ' ' << time << '\n'; @@ -285,7 +284,7 @@ which outputs: 2016-03-19 03:07:02.460737 -And there you have it: `day_point` is a _Rosetta Stone_ for translating _any_ calendar to any other calendar. Just make your calendar convert to and from `day_point`, and you have interoperability with _every_ other calendar which does so. +And there you have it: `sys_days ` is a _Rosetta Stone_ for translating _any_ calendar to any other calendar. Just make your calendar convert to and from `sys_days `, and you have interoperability with _every_ other calendar which does so. using namespace date::literals; auto today = 2016_y/mar/19; @@ -301,7 +300,7 @@ Output: Coptic : 1732-07-10 iso_week: 2016-W11-Sat -This is somewhat of a teaser because as I write this the Julian and Coptic calendars aren't publicly available yet. The software exists, but is not fully tested yet. But more importantly, just follow the recipe in `` for your favorite calendar (convert to and from `day_point`), and your calendar is now part of the club! Contribute your calendar so we can all use it! +This is somewhat of a teaser because as I write this the Julian and Coptic calendars aren't publicly available yet. The software exists, but is not fully tested yet. But more importantly, just follow the recipe in `` for your favorite calendar (convert to and from `sys_days`), and your calendar is now part of the club! Contribute your calendar so we can all use it! ### 2Gs Birthday @@ -321,7 +320,7 @@ This example demonstrates both some simple date arithmetic, and how to handle di using namespace date; // Dave was born April 24, 1954. 10:03 AM pst // Want to know when he is 2 Gigaseconds old - auto birth = day_point{apr/24/1954} + 10h + 3min; + auto birth = sys_days{apr/24/1954} + 10h + 3min; auto z = locate_zone("America/Los_Angeles"); auto t = z->to_sys(birth); t += 2'000'000'000s; @@ -353,12 +352,12 @@ An [ordinal date](https://en.wikipedia.org/wiki/Ordinal_date) consists of a year // calculating the year and the day of the year const auto year = ymd.year(); - const auto year_day = daypoint - day_point{year/jan/0}; + const auto year_day = daypoint - sys_days{year/jan/0}; std::cout << year << '-' << std::setfill('0') << std::setw(3) << year_day.count() << std::endl; // inverse calculation and check - assert(ymd == year_month_day{day_point{year/jan/0} + year_day}); + assert(ymd == year_month_day{sys_days{year/jan/0} + year_day}); } @@ -378,8 +377,8 @@ Let's say you want to search the globe, and all time, for time zones when the da auto& db = get_tzdb(); for (auto const& z : db.zones) { - auto begin = day_point{jan/1/year::min()} + 0s; - auto end = day_point{jan/1/2035} + 0s; + auto begin = sys_days{jan/1/year::min()} + 0s; + auto end = sys_days{jan/1/2035} + 0s; do { auto info = z.get_info(begin, tz::utc); @@ -444,8 +443,8 @@ Ever wonder how the global use of daylight saving time is trending with time? H for (auto& z : db.zones) { ++total; - auto info1 = z.get_info(day_point{y/jan/15}, tz::utc); - auto info2 = z.get_info(day_point{y/jul/15}, tz::utc); + auto info1 = z.get_info(sys_days{y/jan/15}, tz::utc); + auto info2 = z.get_info(sys_days{y/jul/15}, tz::utc); if (info1.save != 0min || info2.save != 0min) ++use_daylight; }