From 1e5d2fa8ddef397b2e5470be9c5a8661f5d83415 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Thu, 21 Apr 2016 16:08:06 -0400 Subject: [PATCH] Create local and system time types for timezone functions. * Add sys_time. * Add sys_days. * Add sys_seconds. * Add local_time. * Add local_days. * Add local_seconds. * Rename day_point to sys_days. * Rename Zone to time_zone. --- date.h | 179 +++++-- iso_week.h | 37 +- test/tz_test/tzdata2016d.txt.zip | Bin 0 -> 128096 bytes test/tz_test/validate.cpp | 63 ++- test/tz_test/zone.pass.cpp | 12 +- tz.cpp | 123 +++-- tz.h | 874 ++++++++++++++++++++++--------- tz_private.h | 32 +- 8 files changed, 906 insertions(+), 414 deletions(-) create mode 100644 test/tz_test/tzdata2016d.txt.zip diff --git a/date.h b/date.h index f88e74c..2703dad 100644 --- a/date.h +++ b/date.h @@ -22,17 +22,23 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that woud involve another several millennia of evolution). +// We did not mean to shout. #include #include #if !(__cplusplus >= 201402) # include #endif +#include +#include #include #include #include #include -#include +#include namespace date { @@ -81,7 +87,22 @@ using months = std::chrono::duration // time_point -using day_point = std::chrono::time_point; +template + using sys_time = std::chrono::time_point; + +using sys_days = sys_time; +using sys_seconds = sys_time; + +struct local_t {}; + +template + using local_time = std::chrono::time_point; + +using local_seconds = local_time; +using local_days = local_time; + +// deprecated: +using day_point = sys_days; // types @@ -314,7 +335,8 @@ class weekday public: explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; explicit weekday(int) = delete; - CONSTCD11 weekday(const day_point& dp) NOEXCEPT; + CONSTCD11 weekday(const sys_days& dp) NOEXCEPT; + CONSTCD11 weekday(const local_days& dp) NOEXCEPT; weekday& operator++() NOEXCEPT; weekday operator++(int) NOEXCEPT; @@ -525,7 +547,9 @@ public: CONSTCD11 year_month_day(const date::year& y, const date::month& m, const date::day& d) NOEXCEPT; CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT; - CONSTCD14 year_month_day(const day_point& dp) NOEXCEPT; + + CONSTCD14 year_month_day(sys_days dp) NOEXCEPT; + CONSTCD14 year_month_day(local_days dp) NOEXCEPT; year_month_day& operator+=(const months& m) NOEXCEPT; year_month_day& operator-=(const months& m) NOEXCEPT; @@ -536,11 +560,13 @@ public: CONSTCD11 date::month month() const NOEXCEPT; CONSTCD11 date::day day() const NOEXCEPT; - CONSTCD14 operator day_point() const NOEXCEPT; + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; CONSTCD14 bool ok() const NOEXCEPT; private: - static CONSTCD14 year_month_day from_day_point(const day_point& dp) NOEXCEPT; + static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; }; CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT; @@ -580,7 +606,8 @@ public: CONSTCD11 date::month_day_last month_day_last() const NOEXCEPT; CONSTCD14 date::day day() const NOEXCEPT; - CONSTCD14 operator day_point() const NOEXCEPT; + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; CONSTCD11 bool ok() const NOEXCEPT; }; @@ -634,7 +661,8 @@ class year_month_weekday public: CONSTCD11 year_month_weekday(const date::year& y, const date::month& m, const date::weekday_indexed& wdi) NOEXCEPT; - CONSTCD14 year_month_weekday(const day_point& dp) NOEXCEPT; + CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 year_month_weekday(const local_days& dp) NOEXCEPT; year_month_weekday& operator+=(const months& m) NOEXCEPT; year_month_weekday& operator-=(const months& m) NOEXCEPT; @@ -647,11 +675,13 @@ public: CONSTCD11 unsigned index() const NOEXCEPT; CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT; - CONSTCD14 operator day_point() const NOEXCEPT; + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; CONSTCD14 bool ok() const NOEXCEPT; private: - static CONSTCD14 year_month_weekday from_day_point(const day_point& dp) NOEXCEPT; + static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; }; CONSTCD11 @@ -707,8 +737,12 @@ public: CONSTCD11 date::weekday weekday() const NOEXCEPT; CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT; - CONSTCD14 operator day_point() const NOEXCEPT; + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; CONSTCD11 bool ok() const NOEXCEPT; + +private: + CONSTCD14 days to_days() const NOEXCEPT; }; CONSTCD11 @@ -1431,7 +1465,13 @@ weekday::weekday(unsigned wd) NOEXCEPT CONSTCD11 inline -weekday::weekday(const day_point& dp) NOEXCEPT +weekday::weekday(const sys_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD11 +inline +weekday::weekday(const local_days& dp) NOEXCEPT : wd_(weekday_from_days(dp.time_since_epoch().count())) {} @@ -2171,6 +2211,20 @@ year_month_day_last::day() const NOEXCEPT d[static_cast(month()) - 1] : date::day{29}; } +CONSTCD14 +inline +year_month_day_last::operator sys_days() const NOEXCEPT +{ + return sys_days(year()/month()/day()); +} + +CONSTCD14 +inline +year_month_day_last::operator local_days() const NOEXCEPT +{ + return local_days(year()/month()/day()); +} + CONSTCD11 inline bool @@ -2305,8 +2359,14 @@ year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT CONSTCD14 inline -year_month_day::year_month_day(const day_point& dp) NOEXCEPT - : year_month_day(from_day_point(dp)) +year_month_day::year_month_day(sys_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(local_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) {} CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;} @@ -2347,7 +2407,8 @@ year_month_day::operator-=(const years& y) NOEXCEPT CONSTCD14 inline -year_month_day::operator day_point() const NOEXCEPT +days +year_month_day::to_days() const NOEXCEPT { static_assert(std::numeric_limits::digits >= 18, "This algorithm has not been ported to a 16 bit unsigned integer"); @@ -2360,14 +2421,21 @@ year_month_day::operator day_point() const NOEXCEPT auto const yoe = static_cast(y - era * 400); // [0, 399] auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1; // [0, 365] auto const doe = yoe * 365 + yoe/4 - yoe/100 + doy; // [0, 146096] - return day_point{days{era * 146097 + static_cast(doe) - 719468}}; + return days{era * 146097 + static_cast(doe) - 719468}; } CONSTCD14 inline -year_month_day_last::operator day_point() const NOEXCEPT +year_month_day::operator sys_days() const NOEXCEPT { - return day_point(year()/month()/day()); + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_day::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; } CONSTCD14 @@ -2449,17 +2517,17 @@ operator<<(std::ostream& os, const year_month_day& ymd) CONSTCD14 inline year_month_day -year_month_day::from_day_point(const day_point& dp) NOEXCEPT +year_month_day::from_days(days dp) NOEXCEPT { static_assert(std::numeric_limits::digits >= 18, "This algorithm has not been ported to a 16 bit unsigned integer"); static_assert(std::numeric_limits::digits >= 20, "This algorithm has not been ported to a 16 bit signed integer"); - auto const z = dp.time_since_epoch().count() + 719468; + auto const z = dp.count() + 719468; auto const era = (z >= 0 ? z : z - 146096) / 146097; auto const doe = static_cast(z - era * 146097); // [0, 146096] auto const yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365; // [0, 399] - auto const y = static_cast(yoe) + era * 400; + auto const y = static_cast(yoe) + era * 400; auto const doy = doe - (365*yoe + yoe/4 - yoe/100); // [0, 365] auto const mp = (5*doy + 2)/153; // [0, 11] auto const d = doy - (153*mp+2)/5 + 1; // [1, 31] @@ -2529,8 +2597,14 @@ year_month_weekday::year_month_weekday(const date::year& y, const date::month& m CONSTCD14 inline -year_month_weekday::year_month_weekday(const day_point& dp) NOEXCEPT - : year_month_weekday(from_day_point(dp)) +year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) {} inline @@ -2594,10 +2668,16 @@ year_month_weekday::weekday_indexed() const NOEXCEPT CONSTCD14 inline -year_month_weekday::operator day_point() const NOEXCEPT +year_month_weekday::operator sys_days() const NOEXCEPT { - auto d = day_point(y_/m_/1); - return d + (wdi_.weekday() - date::weekday(d) + days{(wdi_.index()-1)*7}); + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; } CONSTCD14 @@ -2616,13 +2696,24 @@ year_month_weekday::ok() const NOEXCEPT CONSTCD14 inline year_month_weekday -year_month_weekday::from_day_point(const day_point& dp) NOEXCEPT +year_month_weekday::from_days(days d) NOEXCEPT { + sys_days dp{d}; auto const wd = date::weekday(dp); auto const ymd = year_month_day(dp); return {ymd.year(), ymd.month(), wd[(static_cast(ymd.day())-1)/7+1]}; } +CONSTCD14 +inline +days +year_month_weekday::to_days() const NOEXCEPT +{ + auto d = day_point(y_/m_/1); + return (d + (wdi_.weekday() - date::weekday(d) + days{(wdi_.index()-1)*7}) + ).time_since_epoch(); +} + CONSTCD11 inline bool @@ -2761,10 +2852,16 @@ year_month_weekday_last::weekday_last() const NOEXCEPT CONSTCD14 inline -year_month_weekday_last::operator day_point() const NOEXCEPT +year_month_weekday_last::operator sys_days() const NOEXCEPT { - auto const d = day_point(y_/m_/last); - return d - (date::weekday{d} - wdl_.weekday()); + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday_last::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; } CONSTCD11 @@ -2775,6 +2872,15 @@ year_month_weekday_last::ok() const NOEXCEPT return y_.ok() && m_.ok() && wdl_.ok(); } +CONSTCD14 +inline +days +year_month_weekday_last::to_days() const NOEXCEPT +{ + auto const d = sys_days(y_/m_/last); + return (d - (date::weekday{d} - wdl_.weekday())).time_since_epoch(); +} + CONSTCD11 inline bool @@ -3723,8 +3829,7 @@ typename std::enable_if std::ratio_less::value , std::ostream& >::type -operator<<(std::ostream& os, - const std::chrono::time_point& tp) +operator<<(std::ostream& os, const sys_time& tp) { auto const dp = floor(tp); return os << year_month_day(dp) << ' ' << make_time(tp-dp); @@ -3732,11 +3837,19 @@ operator<<(std::ostream& os, inline std::ostream& -operator<<(std::ostream& os, const day_point& dp) +operator<<(std::ostream& os, const sys_days& dp) { return os << year_month_day(dp); } +template +inline +std::ostream& +operator<<(std::ostream& os, const local_time& ut) +{ + return os << sys_time{ut.time_since_epoch()}; +} + } // namespace date #endif // DATE_H diff --git a/iso_week.h b/iso_week.h index 9a84d8f..8b15eae 100644 --- a/iso_week.h +++ b/iso_week.h @@ -38,7 +38,10 @@ using years = date::years; // time_point -using day_point = date::day_point; +using sys_days = date::sys_days; + +// deprecated: +using day_point = sys_days; // types @@ -95,7 +98,7 @@ public: explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; CONSTCD11 weekday(date::weekday wd) NOEXCEPT; explicit weekday(int) = delete; - CONSTCD11 weekday(const day_point& dp) NOEXCEPT; + CONSTCD11 weekday(const sys_days& dp) NOEXCEPT; weekday& operator++() NOEXCEPT; weekday operator++(int) NOEXCEPT; @@ -328,7 +331,7 @@ public: CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT; CONSTCD11 iso_week::weekday weekday() const NOEXCEPT; - CONSTCD14 operator day_point() const NOEXCEPT; + CONSTCD14 operator sys_days() const NOEXCEPT; CONSTCD11 bool ok() const NOEXCEPT; }; @@ -357,7 +360,7 @@ public: CONSTCD11 year_weeknum_weekday(const iso_week::year& y, const iso_week::weeknum& wn, const iso_week::weekday& wd) NOEXCEPT; CONSTCD14 year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT; - CONSTCD14 year_weeknum_weekday(const day_point& dp) NOEXCEPT; + CONSTCD14 year_weeknum_weekday(const sys_days& dp) NOEXCEPT; year_weeknum_weekday& operator+=(const years& y) NOEXCEPT; year_weeknum_weekday& operator-=(const years& y) NOEXCEPT; @@ -366,11 +369,11 @@ public: CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT; CONSTCD11 iso_week::weekday weekday() const NOEXCEPT; - CONSTCD14 operator day_point() const NOEXCEPT; + CONSTCD14 operator sys_days() const NOEXCEPT; CONSTCD14 bool ok() const NOEXCEPT; private: - static CONSTCD14 year_weeknum_weekday from_day_point(const day_point& dp) NOEXCEPT; + static CONSTCD14 year_weeknum_weekday from_day_point(const sys_days& dp) NOEXCEPT; }; CONSTCD11 bool operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; @@ -431,7 +434,7 @@ weekday::weekday(date::weekday wd) NOEXCEPT CONSTCD11 inline -weekday::weekday(const day_point& dp) NOEXCEPT +weekday::weekday(const sys_days& dp) NOEXCEPT : wd_(weekday_from_days(dp.time_since_epoch().count())) {} @@ -980,8 +983,8 @@ weeknum year_lastweek::weeknum() const NOEXCEPT { const auto y = date::year{int{y_}}; - const auto s0 = day_point{(y-years{1})/12/date::thu[date::last]}; - const auto s1 = day_point{y/12/date::thu[date::last]}; + const auto s0 = sys_days{(y-years{1})/12/date::thu[date::last]}; + const auto s1 = sys_days{y/12/date::thu[date::last]}; return iso_week::weeknum(date::trunc(s1-s0).count()); } @@ -1273,9 +1276,9 @@ CONSTCD11 inline weekday year_lastweek_weekday::weekday() const NOEXCEPT {return CONSTCD14 inline -year_lastweek_weekday::operator day_point() const NOEXCEPT +year_lastweek_weekday::operator sys_days() const NOEXCEPT { - return day_point{date::year{int{y_}}/date::dec/date::thu[date::last]} + (mon - thu) + return sys_days{date::year{int{y_}}/date::dec/date::thu[date::last]} + (mon - thu) - (mon - wd_); } @@ -1390,7 +1393,7 @@ year_weeknum_weekday::year_weeknum_weekday(const year_lastweek_weekday& ylwwd) N CONSTCD14 inline -year_weeknum_weekday::year_weeknum_weekday(const day_point& dp) NOEXCEPT +year_weeknum_weekday::year_weeknum_weekday(const sys_days& dp) NOEXCEPT : year_weeknum_weekday(from_day_point(dp)) {} @@ -1416,9 +1419,9 @@ CONSTCD11 inline weekday year_weeknum_weekday::weekday() const NOEXCEPT {return CONSTCD14 inline -year_weeknum_weekday::operator day_point() const NOEXCEPT +year_weeknum_weekday::operator sys_days() const NOEXCEPT { - return day_point{date::year{int{y_}-1}/date::dec/date::thu[date::last]} + return sys_days{date::year{int{y_}-1}/date::dec/date::thu[date::last]} + (date::mon - date::thu) + weeks{unsigned{wn_}-1} + (wd_ - mon); } @@ -1433,15 +1436,15 @@ year_weeknum_weekday::ok() const NOEXCEPT CONSTCD14 inline year_weeknum_weekday -year_weeknum_weekday::from_day_point(const day_point& dp) NOEXCEPT +year_weeknum_weekday::from_day_point(const sys_days& dp) NOEXCEPT { const auto wd = iso_week::weekday{dp}; auto y = date::year_month_day{dp + days{3}}.year(); - auto start = day_point{(y - date::years{1})/date::dec/date::thu[date::last]} + (mon-thu); + auto start = sys_days{(y - date::years{1})/date::dec/date::thu[date::last]} + (mon-thu); if (dp < start) { --y; - start = day_point{(y - date::years{1})/date::dec/date::thu[date::last]} + (mon-thu); + start = sys_days{(y - date::years{1})/date::dec/date::thu[date::last]} + (mon-thu); } const auto wn = iso_week::weeknum(date::trunc(dp - start).count() + 1); return {iso_week::year(int{y}), wn, wd}; diff --git a/test/tz_test/tzdata2016d.txt.zip b/test/tz_test/tzdata2016d.txt.zip new file mode 100644 index 0000000000000000000000000000000000000000..8af5ea150edc47bfd0f79ce26d276d9960718cc8 GIT binary patch literal 128096 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

n^TtoE>3?lLV`L$obkm~pY5cFJ^85T2AAfdJ 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®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 void -test_info(const date::Zone* zone, const date::Info& info) +test_info(const date::time_zone* zone, const date::Info& info) { using namespace date; using namespace std::chrono; auto begin = info.begin; auto end = info.end - microseconds{1}; - auto mid = begin + (end - begin) /2 ; + auto mid = begin + (end - begin) /2; + using sys_microseconds = sys_time; + using zoned_microseconds = zoned_time; + using local_microseconds = local_time; + zoned_microseconds local{zone}; - if (begin > day_point{jan/1/1700}) + if (begin > sys_days{jan/1/1700}) { - auto local = zone->to_local(begin).first; - auto prev_local = zone->to_local(begin - seconds{1}).first; - if (prev_local < local - seconds{1}) + auto prev_local = local; + local = begin; + prev_local = begin - seconds{1}; + auto slocal = local.get_local_time(); + auto plocal = prev_local.get_local_time(); + if (plocal < slocal - seconds{1}) { - assert(zone->to_sys(local) == begin); - auto imaginary = prev_local + (local - seconds{1} - prev_local) / 2; + assert(sys_microseconds{local} == begin); try { - zone->to_sys(imaginary); + local = plocal + (slocal - seconds{1} - plocal) / 2; assert(false); } catch (const nonexistent_local_time&) { } } - else if (prev_local > local - seconds{1}) + else if (plocal > slocal - seconds{1}) { - auto ambiguous = local - seconds{1} + - (prev_local - (local - seconds{1})) / 2; try { - zone->to_sys(ambiguous); + local = slocal - seconds{1} + (plocal - (slocal - seconds{1})) / 2; assert(false); } catch (const ambiguous_local_time&) @@ -42,33 +46,34 @@ test_info(const date::Zone* zone, const date::Info& info) } } - auto local = zone->to_local(mid).first; - assert(zone->to_sys(local) == mid); + local = mid; + assert(sys_microseconds{local} == mid); - if (end < day_point{jan/1/3000}) + if (end < sys_days{jan/1/3000}) { - auto local = zone->to_local(end).first; - auto next_local = zone->to_local(info.end).first; - if (next_local < local + microseconds{1}) + local = end; + auto next_local = local; + next_local = info.end; + auto slocal = local.get_local_time(); + auto nlocal = next_local.get_local_time(); + if (nlocal < slocal + microseconds{1}) { - auto ambiguous = next_local + (local + microseconds{1} - next_local) / 2; try { - zone->to_sys(ambiguous); + local = nlocal + (slocal + microseconds{1} - nlocal) / 2; assert(false); } catch (const ambiguous_local_time&) { } } - else if (next_local > local + microseconds{1}) + else if (nlocal > slocal + microseconds{1}) { - assert(zone->to_sys(local) == end); - auto imaginary = local + microseconds{1} + - (next_local - (local + microseconds{1})) / 2; + assert(sys_microseconds{local} == end); try { - zone->to_sys(imaginary); + local = slocal + microseconds{1} + + (nlocal - (slocal + microseconds{1})) / 2; assert(false); } catch (const nonexistent_local_time&) @@ -96,8 +101,8 @@ main() { std::cout << name << '\n'; auto z = locate_zone(name); - 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; auto info = z->get_info(begin, tz::utc); std::cout << "Initially: "; if (info.offset >= 0s) @@ -122,7 +127,7 @@ main() auto dp = floor(begin); auto ymd = year_month_day(dp); auto time = make_time(begin - dp); - std::cout << ymd << 'T' << time << "Z "; + std::cout << ymd << ' ' << time << "Z "; if (info.offset >= 0s) std::cout << '+'; std::cout << make_time(info.offset); diff --git a/test/tz_test/zone.pass.cpp b/test/tz_test/zone.pass.cpp index eed4698..30329e5 100644 --- a/test/tz_test/zone.pass.cpp +++ b/test/tz_test/zone.pass.cpp @@ -6,10 +6,10 @@ main() { using namespace std; using namespace date; - static_assert( is_nothrow_destructible{}, ""); - static_assert(!is_default_constructible{}, ""); - static_assert(!is_copy_constructible{}, ""); - static_assert(!is_copy_assignable{}, ""); - static_assert( is_nothrow_move_constructible{}, ""); - static_assert( is_nothrow_move_assignable{}, ""); + static_assert( is_nothrow_destructible{}, ""); + static_assert(!is_default_constructible{}, ""); + static_assert(!is_copy_constructible{}, ""); + static_assert(!is_copy_assignable{}, ""); + static_assert( is_nothrow_move_constructible{}, ""); + static_assert( is_nothrow_move_assignable{}, ""); } diff --git a/tz.cpp b/tz.cpp index ab4870f..c3fa838 100644 --- a/tz.cpp +++ b/tz.cpp @@ -20,6 +20,10 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that woud involve another several millennia of evolution). +// We did not mean to shout. #include "tz_private.h" @@ -118,6 +122,8 @@ CONSTDATA auto max_year = date::year::max(); // Arbitrary day of the year that will be away from any limits. // Used with year::min() and year::max(). CONSTDATA auto boring_day = date::aug/18; +CONSTDATA auto min_day = date::jan/1; +CONSTDATA auto max_day = date::dec/31; // +-------------------+ // | End Configuration | @@ -549,7 +555,7 @@ parse_signed_time(std::istream& in) // MonthDayTime -MonthDayTime::MonthDayTime(second_point tp, tz timezone) +MonthDayTime::MonthDayTime(local_seconds tp, tz timezone) : zone_(timezone) { using namespace date; @@ -606,8 +612,8 @@ MonthDayTime::compare(date::year y, const MonthDayTime& x, date::year yx, { if (zone_ != x.zone_) { - auto dp0 = to_day_point(y); - auto dp1 = x.to_day_point(yx); + auto dp0 = to_sys_days(y); + auto dp1 = x.to_sys_days(yx); if (std::abs((dp0-dp1).count()) > 1) return dp0 < dp1 ? -1 : 1; if (zone_ == tz::local) @@ -642,7 +648,7 @@ MonthDayTime::compare(date::year y, const MonthDayTime& x, date::year yx, return t0 < t1 ? -1 : t0 == t1 ? 0 : 1; } -second_point +sys_seconds MonthDayTime::to_sys(date::year y, std::chrono::seconds offset, std::chrono::seconds save) const { @@ -677,23 +683,23 @@ MonthDayTime::U::operator=(const pair& x) return *this; } -date::day_point -MonthDayTime::to_day_point(date::year y) const +date::sys_days +MonthDayTime::to_sys_days(date::year y) const { using namespace std::chrono; using namespace date; switch (type_) { case month_day: - return day_point(y/u.month_day_); + return sys_days(y/u.month_day_); case month_last_dow: - return day_point(y/u.month_weekday_last_); + return sys_days(y/u.month_weekday_last_); case lteq: { auto const x = y/u.month_day_weekday_.month_day_; auto const wd1 = weekday(x); auto const wd0 = u.month_day_weekday_.weekday_; - return day_point(x) - (wd1-wd0); + return sys_days(x) - (wd1-wd0); } case gteq: break; @@ -701,13 +707,13 @@ MonthDayTime::to_day_point(date::year y) const auto const x = y/u.month_day_weekday_.month_day_; auto const wd1 = u.month_day_weekday_.weekday_; auto const wd0 = weekday(x); - return day_point(x) + (wd1-wd0); + return sys_days(x) + (wd1-wd0); } -second_point +sys_seconds MonthDayTime::to_time_point(date::year y) const { - return to_day_point(y) + h_ + m_ + s_; + return to_sys_days(y) + h_ + m_ + s_; } void @@ -721,7 +727,7 @@ MonthDayTime::canonicalize(date::year y) return; case month_last_dow: { - auto const ymd = year_month_day(y/u.month_weekday_last_); + auto const ymd = year_month_day(sys_days{y/u.month_weekday_last_}); u.month_day_ = ymd.month()/ymd.day(); type_ = month_day; return; @@ -731,7 +737,7 @@ MonthDayTime::canonicalize(date::year y) auto const x = y/u.month_day_weekday_.month_day_; auto const wd1 = weekday(x); auto const wd0 = u.month_day_weekday_.weekday_; - auto const ymd = year_month_day(day_point(x) - (wd1-wd0)); + auto const ymd = year_month_day(sys_days(x) - (wd1-wd0)); u.month_day_ = ymd.month()/ymd.day(); type_ = month_day; return; @@ -741,7 +747,7 @@ MonthDayTime::canonicalize(date::year y) auto const x = y/u.month_day_weekday_.month_day_; auto const wd1 = u.month_day_weekday_.weekday_; auto const wd0 = weekday(x); - auto const ymd = year_month_day(day_point(x) + (wd1-wd0)); + auto const ymd = year_month_day(sys_days(x) + (wd1-wd0)); u.month_day_ = ymd.month()/ymd.day(); type_ = month_day; return; @@ -1218,9 +1224,9 @@ Rule::split_overlaps(std::vector& rules) rules.shrink_to_fit(); } -// Zone +// time_zone -Zone::zonelet::~zonelet() +time_zone::zonelet::~zonelet() { #if !defined(_MSC_VER) || (_MSC_VER >= 1900) using minutes = std::chrono::minutes; @@ -1232,14 +1238,14 @@ Zone::zonelet::~zonelet() #endif } -Zone::zonelet::zonelet() +time_zone::zonelet::zonelet() { #if !defined(_MSC_VER) || (_MSC_VER >= 1900) ::new(&u.rule_) std::string(); #endif } -Zone::zonelet::zonelet(const zonelet& i) +time_zone::zonelet::zonelet(const zonelet& i) : gmtoff_(i.gmtoff_) , tag_(i.tag_) , format_(i.format_) @@ -1266,7 +1272,7 @@ Zone::zonelet::zonelet(const zonelet& i) #endif } -Zone::Zone(const std::string& s) +time_zone::time_zone(const std::string& s) #if LAZY_INIT : adjusted_(new std::once_flag{}) #endif @@ -1290,7 +1296,7 @@ Zone::Zone(const std::string& s) } void -Zone::add(const std::string& s) +time_zone::add(const std::string& s) { try { @@ -1310,7 +1316,7 @@ Zone::add(const std::string& s) } void -Zone::parse_info(std::istream& in) +time_zone::parse_info(std::istream& in) { using namespace date; using namespace std::chrono; @@ -1326,7 +1332,7 @@ Zone::parse_info(std::istream& in) if (in.eof() || in.peek() == '#') { zonelet.until_year_ = year::max(); - zonelet.until_date_ = MonthDayTime(boring_day, tz::utc); + zonelet.until_date_ = MonthDayTime(max_day, tz::utc); } else { @@ -1489,8 +1495,9 @@ find_rule_for_zone(const std::pair& eqr, static std::pair find_rule_for_zone(const std::pair& eqr, - const second_point& tp_utc, const second_point& tp_std, - const second_point& tp_loc) + const sys_seconds& tp_utc, + const local_seconds& tp_std, + const local_seconds& tp_loc) { using namespace std::chrono; using namespace date; @@ -1508,10 +1515,10 @@ find_rule_for_zone(const std::pair& eqr, found = tp_utc < r->mdt().to_time_point(ry); break; case tz::standard: - found = tp_std < r->mdt().to_time_point(ry); + found = sys_seconds{tp_std.time_since_epoch()} < r->mdt().to_time_point(ry); break; case tz::local: - found = tp_loc < r->mdt().to_time_point(ry); + found = sys_seconds{tp_loc.time_since_epoch()} < r->mdt().to_time_point(ry); break; } if (found) @@ -1536,7 +1543,7 @@ find_rule(const std::pair& first_rule, using namespace date; auto r = first_rule.first; auto ry = first_rule.second; - Info x{day_point(year::min()/boring_day), day_point(year::max()/boring_day), + Info x{sys_days(year::min()/min_day), sys_days(year::max()/max_day), seconds{0}, initial_save, initial_abbrev}; while (r != nullptr) { @@ -1569,7 +1576,7 @@ find_rule(const std::pair& first_rule, x.end = r->mdt().to_sys(ry, offset, x.save); } else - x.end = day_point(year::max()/boring_day); + x.end = sys_days(year::max()/max_day); break; } x.save = r->save(); @@ -1580,7 +1587,7 @@ find_rule(const std::pair& first_rule, } void -Zone::adjust_infos(const std::vector& rules) +time_zone::adjust_infos(const std::vector& rules) { using namespace std::chrono; using namespace date; @@ -1640,7 +1647,7 @@ Zone::adjust_infos(const std::vector& rules) final_save = z.last_rule_.first->save(); } z.until_utc_ = z.until_date_.to_sys(z.until_year_, z.gmtoff_, final_save); - z.until_std_ = z.until_utc_ + z.gmtoff_; + z.until_std_ = local_seconds{z.until_utc_.time_since_epoch()} + z.gmtoff_; z.until_loc_ = z.until_std_ + final_save; if (z.tag_ == zonelet::has_rule) @@ -1751,7 +1758,7 @@ format_abbrev(std::string format, const std::string& variable, std::chrono::seco } Info -Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const +time_zone::get_info_impl(sys_seconds tp, tz timezone) const { using namespace std::chrono; using namespace date; @@ -1761,17 +1768,18 @@ Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const throw std::runtime_error("The year " + std::to_string(static_cast(y)) + " is out of range:[" + std::to_string(static_cast(min_year)) + ", " + std::to_string(static_cast(max_year)) + "]"); - auto tps = floor(tp); #if LAZY_INIT - std::call_once(*adjusted_, [this]() - { - const_cast(this)->adjust_infos(get_tzdb().rules); - }); + std::call_once(*adjusted_, + [this]() + { + const_cast(this)->adjust_infos(get_tzdb().rules); + }); #endif - auto i = std::upper_bound(zonelets_.begin(), zonelets_.end(), tps, - [timezone](second_point t, const zonelet& zl) + auto i = std::upper_bound(zonelets_.begin(), zonelets_.end(), tp, + [timezone](sys_seconds t, const zonelet& zl) { - return timezone == tz::utc ? t < zl.until_utc_ : t < zl.until_loc_; + return timezone == tz::utc ? t < zl.until_utc_ : + t < sys_seconds{zl.until_loc_.time_since_epoch()}; }); Info r{}; @@ -1782,7 +1790,7 @@ Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const if (i != zonelets_.begin()) r.begin = i[-1].until_utc_; else - r.begin = day_point(year::min()/boring_day); + r.begin = sys_days(year::min()/min_day); r.end = i->until_utc_; r.offset = i->gmtoff_ + i->u.save_; r.save = i->u.save_; @@ -1792,15 +1800,15 @@ Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const if (i != zonelets_.begin()) r.begin = i[-1].until_utc_; else - r.begin = day_point(year::min()/boring_day); + r.begin = sys_days(year::min()/min_day); r.end = i->until_utc_; r.offset = i->gmtoff_; } else { r = find_rule(i->first_rule_, i->last_rule_, y, i->gmtoff_, - MonthDayTime(tps, timezone), i->initial_save_, - i->initial_abbrev_); + MonthDayTime(local_seconds{tp.time_since_epoch()}, timezone), + i->initial_save_, i->initial_abbrev_); r.offset = i->gmtoff_ + r.save; if (i != zonelets_.begin() && r.begin < i[-1].until_utc_) r.begin = i[-1].until_utc_; @@ -1814,7 +1822,7 @@ Zone::get_info(std::chrono::system_clock::time_point tp, tz timezone) const } std::ostream& -operator<<(std::ostream& os, const Zone& z) +operator<<(std::ostream& os, const time_zone& z) { using namespace date; using namespace std::chrono; @@ -1822,10 +1830,11 @@ operator<<(std::ostream& os, const Zone& z) os.fill(' '); os.flags(std::ios::dec | std::ios::left); #if LAZY_INIT - std::call_once(*z.adjusted_, [&z]() - { - const_cast(z).adjust_infos(get_tzdb().rules); - }); + std::call_once(*z.adjusted_, + [&z]() + { + const_cast(z).adjust_infos(get_tzdb().rules); + }); #endif os.width(35); os << z.name_; @@ -1837,7 +1846,7 @@ operator<<(std::ostream& os, const Zone& z) os << ' '; os << make_time(s.gmtoff_) << " "; os.width(15); - if (s.tag_ != Zone::zonelet::has_save) + if (s.tag_ != time_zone::zonelet::has_save) os << s.u.rule_; else { @@ -2120,7 +2129,7 @@ init_tzdb() } else if (word == "Zone") { - db.zones.push_back(Zone(line)); + db.zones.push_back(time_zone(line)); continue_zone = true; } else if (line[0] == '\t' && continue_zone) @@ -2182,12 +2191,12 @@ get_tzdb() return ref; } -const Zone* +const time_zone* locate_zone(const std::string& tz_name) { const auto& db = get_tzdb(); auto zi = std::lower_bound(db.zones.begin(), db.zones.end(), tz_name, - [](const Zone& z, const std::string& nm) + [](const time_zone& z, const std::string& nm) { return z.name() < nm; }); @@ -2201,7 +2210,7 @@ locate_zone(const std::string& tz_name) if (li != db.links.end() && li->name() == tz_name) { zi = std::lower_bound(db.zones.begin(), db.zones.end(), li->target(), - [](const Zone& z, const std::string& nm) + [](const time_zone& z, const std::string& nm) { return z.name() < nm; }); @@ -2215,7 +2224,7 @@ locate_zone(const std::string& tz_name) #ifdef TZ_TEST #ifdef _WIN32 -const Zone* +const time_zone* locate_native_zone(const std::string& native_tz_name) { std::string standard_tz_name; @@ -2305,7 +2314,7 @@ operator<<(std::ostream& os, const Info& r) #ifdef _WIN32 -const Zone* +const time_zone* current_zone() { #if TIMEZONE_MAPPING @@ -2346,7 +2355,7 @@ current_zone() #else // ! WIN32 -const Zone* +const time_zone* current_zone() { // On some versions of some linux distro's (e.g. Ubuntu), diff --git a/tz.h b/tz.h index 46e6386..1ff0aa5 100644 --- a/tz.h +++ b/tz.h @@ -22,6 +22,10 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that woud involve another several millennia of evolution). +// We did not mean to shout. // Get more recent database at http://www.iana.org/time-zones @@ -93,9 +97,6 @@ static_assert(HAS_REMOTE_API == 0 ? AUTO_DOWNLOAD == 0 : true, namespace date { -using second_point = std::chrono::time_point; - enum class tz {utc, local, standard}; enum class choose {earliest, latest}; @@ -103,42 +104,37 @@ class nonexistent_local_time : public std::runtime_error { public: - template - nonexistent_local_time(std::chrono::time_point> tp, - second_point first, const std::string& first_abbrev, - second_point last, const std::string& last_abbrev, - second_point time_sys); + template + nonexistent_local_time(local_time tp, local_seconds first, + const std::string& first_abbrev, local_seconds last, + const std::string& last_abbrev, sys_seconds time_sys); private: - template + template static std::string - make_msg(std::chrono::time_point> tp, - second_point first, const std::string& first_abbrev, - second_point last, const std::string& last_abbrev, - second_point time_sys); + make_msg(local_time tp, + local_seconds first, const std::string& first_abbrev, + local_seconds last, const std::string& last_abbrev, + sys_seconds time_sys); }; -template +template inline -nonexistent_local_time::nonexistent_local_time( - std::chrono::time_point> tp, - second_point first, const std::string& first_abbrev, - second_point last, const std::string& last_abbrev, - second_point time_sys) +nonexistent_local_time::nonexistent_local_time(local_time tp, + local_seconds first, + const std::string& first_abbrev, + local_seconds last, + const std::string& last_abbrev, + sys_seconds time_sys) : std::runtime_error(make_msg(tp, first, first_abbrev, last, last_abbrev, time_sys)) {} -template +template std::string -nonexistent_local_time::make_msg(std::chrono::time_point> tp, - second_point first, const std::string& first_abbrev, - second_point last, const std::string& last_abbrev, - second_point time_sys) +nonexistent_local_time::make_msg(local_time tp, local_seconds first, + const std::string& first_abbrev, local_seconds last, + const std::string& last_abbrev, sys_seconds time_sys) { using namespace date; std::ostringstream os; @@ -154,29 +150,25 @@ class ambiguous_local_time : public std::runtime_error { public: - template - ambiguous_local_time(std::chrono::time_point> tp, - std::chrono::seconds first_offset, + template + ambiguous_local_time(local_time tp, std::chrono::seconds first_offset, const std::string& first_abbrev, std::chrono::seconds second_offset, const std::string& second_abbrev); private: - template + template static std::string - make_msg(std::chrono::time_point> tp, + make_msg(local_time tp, std::chrono::seconds first_offset, const std::string& first_abbrev, std::chrono::seconds second_offset, const std::string& second_abbrev); }; -template +template inline ambiguous_local_time::ambiguous_local_time( - std::chrono::time_point> tp, + local_time tp, std::chrono::seconds first_offset, const std::string& first_abbrev, std::chrono::seconds second_offset, @@ -185,10 +177,9 @@ ambiguous_local_time::ambiguous_local_time( second_abbrev)) {} -template +template std::string -ambiguous_local_time::make_msg(std::chrono::time_point> tp, +ambiguous_local_time::make_msg(local_time tp, std::chrono::seconds first_offset, const std::string& first_abbrev, std::chrono::seconds second_offset, @@ -197,8 +188,10 @@ ambiguous_local_time::make_msg(std::chrono::time_point +inline +Duration +sum(Duration d) +{ + return d; +} + +template +inline +std::common_type_t +sum(D1 d1, D2 d2, Durations ...durations) +{ + return d1 + d2 + sum(durations...); +} + +} // detail + +template +class zoned_time +{ + const time_zone* zone_; + sys_time tp_; + +public: + zoned_time(sys_time st); + explicit zoned_time(const time_zone* z); + explicit zoned_time(const std::string& name); + + template , + sys_time>::value + >> + zoned_time(const zoned_time& zt); + + zoned_time(const time_zone* z, local_time tp); + zoned_time(const std::string& name, local_time tp); + zoned_time(const time_zone* z, local_time tp, choose c); + zoned_time(const std::string& name, local_time tp, choose c); + + zoned_time(const time_zone* z, const zoned_time& zt); + zoned_time(const std::string& name, const zoned_time& zt); + zoned_time(const time_zone* z, const zoned_time& zt, choose c); + zoned_time(const std::string& name, const zoned_time& zt, choose c); + + zoned_time(const time_zone* z, const sys_time& st); + zoned_time(const std::string& name, const sys_time& st); + + zoned_time& operator=(sys_time st); + zoned_time& operator=(local_time ut); + + explicit operator local_time() const; + operator sys_time() const; + + const time_zone* get_time_zone() const; + local_time get_local_time() const; + sys_time get_sys_time() const; + + template + friend + bool + operator==(const zoned_time& x, const zoned_time& y); + + template + friend + std::ostream& + operator<<(std::ostream& os, const zoned_time& t); + +private: + + static_assert(std::ratio_less_equal::value, + "zoned_time must have a precision of hours or finer"); +}; + +using zoned_seconds = zoned_time; + +// Should equality bother with comparing zones? +// If zones don't matter, add operator< ? +template +inline +bool +operator==(const zoned_time& x, const zoned_time& y) +{ + return x.zone == y.zone && x.tp == y.tp; +} + +template +inline +bool +operator!=(const zoned_time& x, const zoned_time& y) +{ + return !(x == y); +} + +class time_zone { private: struct zonelet; @@ -229,10 +333,58 @@ private: public: #if !defined(_MSC_VER) || (_MSC_VER >= 1900) - Zone(Zone&&) = default; - Zone& operator=(Zone&&) = default; -#else // defined(_MSC_VER) || (_MSC_VER >= 1900) - Zone(Zone&& src) + time_zone(time_zone&&) = default; + time_zone& operator=(time_zone&&) = default; +#else // defined(_MSC_VER) && (_MSC_VER < 1900) + time_zone(time_zone&& src); + time_zone& operator=(time_zone&& src); +#endif // defined(_MSC_VER) && (_MSC_VER < 1900) + + explicit time_zone(const std::string& s); + + const std::string& name() const; + + template Info get_info(sys_time st) const; + template Info get_info(local_time tp) const; + +private: + template + sys_time::type> + to_sys(local_time tp) const; + + template + sys_time::type> + to_sys(local_time tp, choose z) const; + + template + local_time::type> + to_local(sys_time tp) const; + +public: + friend bool operator==(const time_zone& x, const time_zone& y); + friend bool operator< (const time_zone& x, const time_zone& y); + friend std::ostream& operator<<(std::ostream& os, const time_zone& z); + + void add(const std::string& s); + void adjust_infos(const std::vector& rules); + +private: + Info get_info_impl(sys_seconds tp, tz timezone) const; + + void parse_info(std::istream& in); + + template + sys_time::type> + to_sys_impl(local_time tp, choose z, + std::integral_constant do_throw) const; + + template friend class zoned_time; +}; + +#if defined(_MSC_VER) && (_MSC_VER < 1900) + +inline +time_zone::time_zone(time_zone&& src) : name_(std::move(src.name_)) , zonelets_(std::move(src.zonelets_)) #if LAZY_INIT @@ -240,162 +392,119 @@ public: #endif {} - Zone& operator=(Zone&& src) - { - name_ = std::move(src.name_); - zonelets_ = std::move(src.zonelets_); -#if LAZY_INIT - adjusted_ = std::move(src.adjusted_); -#endif - return *this; - } -#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) - - explicit Zone(const std::string& s); - - const std::string& name() const {return name_;} - Info get_info(std::chrono::system_clock::time_point tp, tz timezone) const; - - template - Info - get_info(std::chrono::time_point> tp, - tz timezone) const - { - using namespace std::chrono; - return get_info(floor(tp), timezone); - } - - template - std::chrono::time_point, - std::chrono::seconds>::type> - to_sys(std::chrono::time_point> tp) const; - - template - std::chrono::time_point, - std::chrono::seconds>::type> - to_sys(std::chrono::time_point> tp, - choose z) const; - - template - std::pair - < - std::chrono::time_point, - std::chrono::seconds>::type>, - std::string - > - to_local(std::chrono::time_point> tp) const; - - friend bool operator==(const Zone& x, const Zone& y); - friend bool operator< (const Zone& x, const Zone& y); - friend std::ostream& operator<<(std::ostream& os, const Zone& z); - - void add(const std::string& s); - void adjust_infos(const std::vector& rules); - -private: - void parse_info(std::istream& in); - - template - std::chrono::time_point, - std::chrono::seconds>::type> - to_sys_impl(std::chrono::time_point> tp, - choose z, std::integral_constant do_throw) const; -}; - -template inline -std::chrono::time_point, - std::chrono::seconds>::type> -Zone::to_sys(std::chrono::time_point> tp) const +time_zone& +time_zone::operator=(time_zone&& src) +{ + name_ = std::move(src.name_); + zonelets_ = std::move(src.zonelets_); +#if LAZY_INIT + adjusted_ = std::move(src.adjusted_); +#endif + return *this; +} + +#endif // defined(_MSC_VER) && (_MSC_VER < 1900) + +inline +const std::string& +time_zone::name() const +{ + return name_; +} + +template +inline +Info +time_zone::get_info(sys_time st) const +{ + using namespace std::chrono; + return get_info_impl(floor(st), tz::utc); +} + +template +inline +Info +time_zone::get_info(local_time tp) const +{ + using namespace std::chrono; + return get_info_impl(floor(sys_time{tp.time_since_epoch()}), + tz::local); +} + +template +inline +sys_time::type> +time_zone::to_sys(local_time tp) const { return to_sys_impl(tp, choose{}, std::true_type{}); } -template +template inline -std::chrono::time_point, - std::chrono::seconds>::type> -Zone::to_sys(std::chrono::time_point> tp, choose z) const +sys_time::type> +time_zone::to_sys(local_time tp, choose z) const { return to_sys_impl(tp, z, std::false_type{}); } -template +template inline -std::pair -< - std::chrono::time_point, - std::chrono::seconds>::type>, - std::string -> -Zone::to_local(std::chrono::time_point> tp) const +local_time::type> +time_zone::to_local(sys_time tp) const { - auto const i = get_info(tp, tz::utc); - return {tp + i.offset, i.abbrev}; + using LT = local_time::type>; + auto i = get_info(tp); + return LT{(tp + i.offset).time_since_epoch()}; } -inline bool operator==(const Zone& x, const Zone& y) {return x.name_ == y.name_;} -inline bool operator< (const Zone& x, const Zone& y) {return x.name_ < y.name_;} +inline bool operator==(const time_zone& x, const time_zone& y) {return x.name_ == y.name_;} +inline bool operator< (const time_zone& x, const time_zone& y) {return x.name_ < y.name_;} -inline bool operator!=(const Zone& x, const Zone& y) {return !(x == y);} -inline bool operator> (const Zone& x, const Zone& y) {return y < x;} -inline bool operator<=(const Zone& x, const Zone& y) {return !(y < x);} -inline bool operator>=(const Zone& x, const Zone& y) {return !(x < y);} +inline bool operator!=(const time_zone& x, const time_zone& y) {return !(x == y);} +inline bool operator> (const time_zone& x, const time_zone& y) {return y < x;} +inline bool operator<=(const time_zone& x, const time_zone& y) {return !(y < x);} +inline bool operator>=(const time_zone& x, const time_zone& y) {return !(x < y);} -template -std::chrono::time_point, - std::chrono::seconds>::type> -Zone::to_sys_impl(std::chrono::time_point> tp, - choose z, std::integral_constant do_throw) const +template +sys_time::type> +time_zone::to_sys_impl(local_time tp, choose z, + std::integral_constant do_throw) const { using namespace date; using namespace std::chrono; - auto i = get_info(tp, tz::local); - auto tp_sys = tp - i.offset; + auto i = get_info(tp); + auto tp_sys = sys_time{tp.time_since_epoch()} - i.offset; if (floor(tp_sys) - i.begin <= days{1}) { - if (floor(tp) < i.begin + i.offset) + auto ut_begin = local_seconds{i.begin.time_since_epoch()} + i.offset; + if (floor(tp) < ut_begin) { if (do_throw) { - auto prev = get_info(i.begin - seconds{1}, tz::utc); - throw nonexistent_local_time(tp, i.begin + prev.offset, prev.abbrev, - i.begin + i.offset, i.abbrev, i.begin); + auto prev = get_info(i.begin - seconds{1}); + auto ut_prev_begin = local_seconds{i.begin.time_since_epoch()} + prev.offset; + throw nonexistent_local_time(tp, ut_prev_begin, prev.abbrev, + ut_begin, i.abbrev, i.begin); } return i.begin; } assert(floor(tp) >= - i.begin + get_info(i.begin - seconds{1}, tz::utc).offset); + local_seconds{i.begin.time_since_epoch()} + + get_info(i.begin - seconds{1}).offset); } if (i.end - floor(tp_sys) <= days{1}) { - assert(floor(tp) < i.end + i.offset); - auto next = get_info(i.end, tz::utc); - if (floor(tp) >= i.end + next.offset) + assert(floor(tp) < local_seconds{i.end.time_since_epoch()} + i.offset); + auto next = get_info(i.end); + if (floor(tp) >= local_seconds{i.end.time_since_epoch()} + next.offset) { if (do_throw) throw ambiguous_local_time(tp, i.offset, i.abbrev, - next.offset, next.abbrev); + next.offset, next.abbrev); if (z == choose::earliest) return tp_sys; - return tp - next.offset; + return sys_time{tp.time_since_epoch()} - next.offset; } } return tp_sys; @@ -426,12 +535,12 @@ inline bool operator>=(const Link& x, const Link& y) {return !(x < y);} class Leap { private: - second_point date_; + sys_seconds date_; public: explicit Leap(const std::string& s); - second_point date() const {return date_;} + sys_seconds date() const {return date_;} friend bool operator==(const Leap& x, const Leap& y) {return x.date_ == y.date_;} friend bool operator< (const Leap& x, const Leap& y) {return x.date_ < y.date_;} @@ -439,8 +548,7 @@ public: template friend bool - operator==(const Leap& x, - const std::chrono::time_point& y) + operator==(const Leap& x, const sys_time& y) { return x.date_ == y; } @@ -448,8 +556,7 @@ public: template friend bool - operator< (const Leap& x, - const std::chrono::time_point& y) + operator< (const Leap& x, const sys_time& y) { return x.date_ < y; } @@ -457,8 +564,7 @@ public: template friend bool - operator< (const std::chrono::time_point& x, - const Leap& y) + operator< (const sys_time& x, const Leap& y) { return x < y.date_; } @@ -474,8 +580,7 @@ inline bool operator>=(const Leap& x, const Leap& y) {return !(x < y);} template inline bool -operator==(const std::chrono::time_point& x, - const Leap& y) +operator==(const sys_time& x, const Leap& y) { return y == x; } @@ -483,8 +588,7 @@ operator==(const std::chrono::time_point& x template inline bool -operator!=(const Leap& x, - const std::chrono::time_point& y) +operator!=(const Leap& x, const sys_time& y) { return !(x == y); } @@ -492,8 +596,7 @@ operator!=(const Leap& x, template inline bool -operator!=(const std::chrono::time_point& x, - const Leap& y) +operator!=(const sys_time& x, const Leap& y) { return !(x == y); } @@ -501,8 +604,7 @@ operator!=(const std::chrono::time_point& x template inline bool -operator> (const Leap& x, - const std::chrono::time_point& y) +operator> (const Leap& x, const sys_time& y) { return y < x; } @@ -510,8 +612,7 @@ operator> (const Leap& x, template inline bool -operator> (const std::chrono::time_point& x, - const Leap& y) +operator> (const sys_time& x, const Leap& y) { return y < x; } @@ -519,8 +620,7 @@ operator> (const std::chrono::time_point& x template inline bool -operator<=(const Leap& x, - const std::chrono::time_point& y) +operator<=(const Leap& x, const sys_time& y) { return !(y < x); } @@ -528,8 +628,7 @@ operator<=(const Leap& x, template inline bool -operator<=(const std::chrono::time_point& x, - const Leap& y) +operator<=(const sys_time& x, const Leap& y) { return !(y < x); } @@ -537,8 +636,7 @@ operator<=(const std::chrono::time_point& x template inline bool -operator>=(const Leap& x, - const std::chrono::time_point& y) +operator>=(const Leap& x, const sys_time& y) { return !(x < y); } @@ -546,8 +644,7 @@ operator>=(const Leap& x, template inline bool -operator>=(const std::chrono::time_point& x, - const Leap& y) +operator>=(const sys_time& x, const Leap& y) { return !(x < y); } @@ -596,11 +693,11 @@ struct timezone_info struct TZ_DB { - std::string version; - std::vector zones; - std::vector links; - std::vector leaps; - std::vector rules; + std::string version; + std::vector zones; + std::vector links; + std::vector leaps; + std::vector rules; #if TIMEZONE_MAPPING // TODO! These need some protection. std::vector mappings; @@ -653,13 +750,250 @@ bool remote_download(const std::string& version); bool remote_install(const std::string& version); #endif -const Zone* locate_zone(const std::string& tz_name); +const time_zone* locate_zone(const std::string& tz_name); #ifdef TZ_TEST #ifdef _WIN32 -const Zone* locate_native_zone(const std::string& native_tz_name); +const time_zone* locate_native_zone(const std::string& native_tz_name); #endif #endif -const Zone* current_zone(); +const time_zone* current_zone(); + +// zoned_time + +template +inline +zoned_time::zoned_time(sys_time st) + : zone_(locate_zone("UTC")) + , tp_(st) + {} + +template +inline +zoned_time::zoned_time(const time_zone* z) + : zone_(z) + {assert(zone_ != nullptr);} + +template +inline +zoned_time::zoned_time(const std::string& name) + : zoned_time(locate_zone(name)) + {} + +template +inline +zoned_time::zoned_time(const time_zone* z, local_time t) + : zone_(z) + , tp_(floor(z->to_sys(t))) + {} + +template +inline +zoned_time::zoned_time(const std::string& name, local_time t) + : zoned_time(locate_zone(name), t) + {} + +template +inline +zoned_time::zoned_time(const time_zone* z, local_time t, choose c) + : zone_(z) + , tp_(floor(z->to_sys(t, c))) + {} + +template +inline +zoned_time::zoned_time(const std::string& name, local_time t, + choose c) + : zoned_time(locate_zone(name), t, c) + {} + +template +template +inline +zoned_time::zoned_time(const zoned_time& zt) + : zone_(zt.zone_) + , tp_(zt.tp_) + {} + +template +inline +zoned_time::zoned_time(const time_zone* z, const zoned_time& zt) + : zone_(z) + , tp_(zt.tp_) + {} + +template +inline +zoned_time::zoned_time(const std::string& name, const zoned_time& zt) + : zoned_time(locate_zone(name), zt) + {} + +template +inline +zoned_time::zoned_time(const time_zone* z, const zoned_time& zt, choose) + : zoned_time(z, zt) + {} + +template +inline +zoned_time::zoned_time(const std::string& name, + const zoned_time& zt, choose c) + : zoned_time(locate_zone(name), zt, c) + {} + +template +inline +zoned_time::zoned_time(const time_zone* z, const sys_time& st) + : zone_(z) + , tp_(st) + {} + +template +inline +zoned_time::zoned_time(const std::string& name, const sys_time& st) + : zoned_time(locate_zone(name), st) + {} + + +template +inline +zoned_time& +zoned_time::operator=(sys_time st) +{ + tp_ = st; + return *this; +} + +template +inline +zoned_time& +zoned_time::operator=(local_time ut) +{ + tp_ = floor(zone_->to_sys(ut)); + return *this; +} + +template +inline +zoned_time::operator local_time() const +{ + return get_local_time(); +} + +template +inline +zoned_time::operator sys_time() const +{ + return get_sys_time(); +} + +template +inline +const time_zone* +zoned_time::get_time_zone() const +{ + return zone_; +} + +template +inline +local_time +zoned_time::get_local_time() const +{ + return floor(zone_->to_local(tp_)); +} + +template +inline +sys_time +zoned_time::get_sys_time() const +{ + return tp_; +} + +// make_zoned_time + +template +inline +zoned_time +make_zoned(sys_time tp) +{ + return zoned_time{tp}; +} + +template +inline +zoned_time +make_zoned(const time_zone* zone, local_time tp) +{ + return {zone, tp}; +} + +template +inline +zoned_time +make_zoned(const std::string& name, local_time tp) +{ + return {name, tp}; +} + +template +inline +zoned_time +make_zoned(const time_zone* zone, const zoned_time& zt) +{ + return {zone, zt}; +} + +template +inline +zoned_time +make_zoned(const std::string& name, const zoned_time& zt) +{ + return {name, zt}; +} + +template +inline +zoned_time +make_zoned(const time_zone* zone, const zoned_time& zt, choose c) +{ + return {zone, zt, c}; +} + +template +inline +zoned_time +make_zoned(const std::string& name, const zoned_time& zt, choose c) +{ + return {name, zt, c}; +} + +template +inline +zoned_time +make_zoned(const time_zone* zone, const sys_time& st) +{ + return {zone, st}; +} + +template +inline +zoned_time +make_zoned(const std::string& name, const sys_time& st) +{ + return {name, st}; +} + + +template +inline +std::ostream& +operator<<(std::ostream& os, const zoned_time& t) +{ + // this should not use two lookups! + return os << floor(t.zone_->to_local(t.tp_)) << ' ' + << t.zone_->get_info(t.tp_).abbrev; +} class utc_clock { @@ -676,15 +1010,17 @@ public: static std::chrono::time_point::type> - sys_to_utc(std::chrono::time_point t); + sys_to_utc(sys_time t); template static - std::chrono::time_point::type> + sys_time::type> utc_to_sys(std::chrono::time_point t); }; +template + using utc_time = std::chrono::time_point; + inline utc_clock::time_point utc_clock::now() NOEXCEPT @@ -694,28 +1030,24 @@ utc_clock::now() NOEXCEPT } template -std::chrono::time_point::type> -utc_clock::sys_to_utc(std::chrono::time_point t) +utc_time::type> +utc_clock::sys_to_utc(sys_time t) { using namespace std::chrono; using duration = typename std::common_type::type; - using time_point = std::chrono::time_point; auto const& leaps = get_tzdb().leaps; auto const lt = std::upper_bound(leaps.begin(), leaps.end(), t); - return time_point{t.time_since_epoch() + seconds{lt-leaps.begin()}}; + return utc_time{t.time_since_epoch() + seconds{lt-leaps.begin()}}; } template -std::chrono::time_point::type> -utc_clock::utc_to_sys(std::chrono::time_point t) +sys_time::type> +utc_clock::utc_to_sys(utc_time t) { using namespace std::chrono; using duration = typename std::common_type::type; - using time_point = std::chrono::time_point; auto const& leaps = get_tzdb().leaps; - auto tp = time_point{t.time_since_epoch()}; + auto tp = sys_time{t.time_since_epoch()}; auto const lt = std::upper_bound(leaps.begin(), leaps.end(), tp); tp -= seconds{lt-leaps.begin()}; if (lt != leaps.begin() && tp + seconds{1} < lt[-1]) @@ -723,6 +1055,25 @@ utc_clock::utc_to_sys(std::chrono::time_point t) return tp; } +template + using utc_time = std::chrono::time_point; + +template +inline +sys_time +to_sys_time(utc_time ut) +{ + return utc_clock::utc_to_sys(ut); +} + +template +inline +utc_time +to_utc_time(sys_time st) +{ + return utc_clock::sys_to_utc(st); +} + // format namespace detail @@ -731,8 +1082,7 @@ namespace detail template std::string format(const std::locale& loc, std::string format, - std::chrono::time_point tp, - const Zone* zone) + local_time tp, const time_zone* zone = nullptr) { // Handle these specially // %S append fractional seconds if tp has precision finer than seconds @@ -763,13 +1113,10 @@ format(const std::locale& loc, std::string format, break; case 'z': if (zone == nullptr) - { - format.replace(i, 2, "+0000"); - i += 5 - 1; - } + throw std::runtime_error("Can not format local_time with %z"); else { - auto info = zone->get_info(tp, tz::local); + auto info = zone->get_info(tp); auto offset = duration_cast(info.offset); ostringstream os; if (offset >= minutes{0}) @@ -783,13 +1130,10 @@ format(const std::locale& loc, std::string format, break; case 'Z': if (zone == nullptr) - { - format.replace(i, 2, "UTC"); - i += 3 - 1; - } + throw std::runtime_error("Can not format local_time with %z"); else { - auto info = zone->get_info(tp, tz::local); + auto info = zone->get_info(tp); format.replace(i, 2, info.abbrev); i += info.abbrev.size() - 1; } @@ -799,7 +1143,7 @@ format(const std::locale& loc, std::string format, } auto& f = use_facet>(loc); ostringstream os; - auto tt = system_clock::to_time_t(tp); + auto tt = system_clock::to_time_t(sys_time{tp.time_since_epoch()}); std::tm tm{}; #ifndef _MSC_VER gmtime_r(&tt, &tm); @@ -815,36 +1159,53 @@ format(const std::locale& loc, std::string format, template inline std::string -format(const std::locale& loc, std::string format, - std::chrono::time_point tp, - const Zone* zone = nullptr) +format(const std::locale& loc, std::string format, local_time tp) { - return detail::format(loc, std::move(format), tp, zone); -} - -inline -std::string -format(const std::locale& loc, std::string format, day_point tp, - const Zone* zone = nullptr) -{ - return detail::format(loc, std::move(format), tp, zone); + return detail::format(loc, std::move(format), tp); } template inline std::string -format(std::string format, - std::chrono::time_point tp, - const Zone* zone = nullptr) +format(std::string format, local_time tp) { - return detail::format(std::locale{}, std::move(format), tp, zone); + return detail::format(std::locale{}, std::move(format), tp); } +template inline std::string -format(std::string format, day_point tp, const Zone* zone = nullptr) +format(const std::locale& loc, std::string format, const zoned_time& tp) { - return detail::format(std::locale{}, std::move(format), tp, zone); + return detail::format(loc, std::move(format), tp.get_local_time(), + tp.get_time_zone()); +} + +template +inline +std::string +format(std::string format, const zoned_time& tp) +{ + return detail::format(std::locale{}, std::move(format), tp.get_local_time(), + tp.get_time_zone()); +} + +template +inline +std::string +format(const std::locale& loc, std::string format, sys_time tp) +{ + return detail::format(loc, std::move(format), + local_time{tp.time_since_epoch()}, locate_zone("UTC")); +} + +template +inline +std::string +format(std::string format, sys_time tp) +{ + return detail::format(std::locale{}, std::move(format), + local_time{tp.time_since_epoch()}, locate_zone("UTC")); } // parse @@ -855,8 +1216,7 @@ namespace detail template void parse(std::istream& is, const std::string& format, - std::chrono::time_point& tp, - std::string* abbrev = nullptr) + sys_time& tp, std::string* abbrev = nullptr) { using namespace std; using namespace std::chrono; @@ -896,7 +1256,7 @@ parse(std::istream& is, const std::string& format, if (!is.fail()) subseconds = duration_cast(duration{s}); else - err &= ios_base::failbit; + err |= ios_base::failbit; } else { @@ -928,10 +1288,10 @@ parse(std::istream& is, const std::string& format, offset = -offset; } else - err &= ios_base::failbit; + err |= ios_base::failbit; } else - err &= ios_base::failbit; + err |= ios_base::failbit; } break; case 'Z': @@ -944,7 +1304,7 @@ parse(std::istream& is, const std::string& format, { is >> temp_abbrev; if (is.fail()) - err &= ios_base::failbit; + err |= ios_base::failbit; } } break; @@ -977,8 +1337,7 @@ parse(std::istream& is, const std::string& format, template inline void -parse(std::istream& is, const std::string& format, - std::chrono::time_point& tp) +parse(std::istream& is, const std::string& format, sys_time& tp) { detail::parse(is, format, tp); } @@ -986,8 +1345,7 @@ parse(std::istream& is, const std::string& format, template inline void -parse(std::istream& is, const std::string& format, - std::chrono::time_point& tp, +parse(std::istream& is, const std::string& format, sys_time& tp, std::string& abbrev) { detail::parse(is, format, tp, &abbrev); diff --git a/tz_private.h b/tz_private.h index c706638..497813b 100644 --- a/tz_private.h +++ b/tz_private.h @@ -3,7 +3,7 @@ // The MIT License (MIT) // -// Copyright (c) 2015 Howard Hinnant +// Copyright (c) 2015, 2016 Howard Hinnant // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -22,6 +22,10 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that woud involve another several millennia of evolution). +// We did not mean to shout. #include "tz.h" @@ -80,7 +84,7 @@ private: public: MonthDayTime() = default; - MonthDayTime(second_point tp, tz timezone); + MonthDayTime(local_seconds tp, tz timezone); MonthDayTime(const date::month_day& md, tz timezone); date::day day() const; @@ -89,11 +93,11 @@ public: void canonicalize(date::year y); - second_point + sys_seconds to_sys(date::year y, std::chrono::seconds offset, std::chrono::seconds save) const; - date::day_point to_day_point(date::year y) const; + sys_days to_sys_days(date::year y) const; - second_point to_time_point(date::year y) const; + sys_seconds to_time_point(date::year y) const; int compare(date::year y, const MonthDayTime& x, date::year yx, std::chrono::seconds offset, std::chrono::minutes prev_save) const; @@ -181,7 +185,7 @@ inline bool operator> (const std::string& x, const Rule& y) {return y < x;} inline bool operator<=(const std::string& x, const Rule& y) {return !(y < x);} inline bool operator>=(const std::string& x, const Rule& y) {return !(x < y);} -struct Zone::zonelet +struct time_zone::zonelet { enum tag {has_rule, has_save, is_empty}; @@ -203,14 +207,14 @@ struct Zone::zonelet U& operator=(const U&) = delete; } u; - std::string format_; - date::year until_year_{0}; - MonthDayTime until_date_; - second_point until_utc_; - second_point until_std_; - second_point until_loc_; - std::chrono::minutes initial_save_{}; - std::string initial_abbrev_; + std::string format_; + date::year until_year_{0}; + MonthDayTime until_date_; + sys_seconds until_utc_; + local_seconds until_std_; + local_seconds until_loc_; + std::chrono::minutes initial_save_{}; + std::string initial_abbrev_; std::pair first_rule_{nullptr, date::year::min()}; std::pair last_rule_{nullptr, date::year::max()};