From f43c39fcf1d338d858a9e02ddd6d0cffb462897a Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Wed, 6 May 2020 22:12:15 -0400 Subject: [PATCH] Add member function name() const to Posix::time_zone * Returns the minimal string that uniquely identifies this time_zone. That is, it takes advantage of all defaults. --- include/date/ptz.h | 106 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/include/date/ptz.h b/include/date/ptz.h index 5cd7545..ad4c379 100644 --- a/include/date/ptz.h +++ b/include/date/ptz.h @@ -87,6 +87,7 @@ public: bool ok() const {return mode_ != off;} date::local_seconds operator()(date::year y) const; + std::string to_string() const; friend std::ostream& operator<<(std::ostream& os, const rule& r); friend unsigned read_date(const string_t& s, unsigned i, rule& r); @@ -119,6 +120,62 @@ rule::operator()(date::year y) const return t; } +inline +std::string +rule::to_string() const +{ + using namespace std::chrono; + auto print_offset = [](seconds off) + { + std::string nm; + if (off != hours{2}) + { + date::hh_mm_ss offset{off}; + nm = '/'; + nm += std::to_string(offset.hours().count()); + if (offset.minutes() != minutes{0} || offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.minutes() < minutes{10}) + nm += '0'; + nm += std::to_string(offset.minutes().count()); + if (offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.seconds() < seconds{10}) + nm += '0'; + nm += std::to_string(offset.seconds().count()); + } + } + } + return nm; + }; + + std::string nm; + switch (mode_) + { + case rule::J: + nm = 'J'; + nm += std::to_string(n_); + break; + case rule::M: + nm = 'M'; + nm += std::to_string(static_cast(m_)); + nm += '.'; + nm += std::to_string(n_); + nm += '.'; + nm += std::to_string(wd_.c_encoding()); + break; + case rule::N: + nm = std::to_string(n_); + break; + default: + break; + } + nm += print_offset(time_); + return nm; +} + inline std::ostream& operator<<(std::ostream& os, const rule& r) @@ -178,6 +235,8 @@ public: friend std::ostream& operator<<(std::ostream& os, const time_zone& z); const time_zone* operator->() const {return this;} + + std::string name() const; }; inline @@ -419,6 +478,53 @@ operator<<(std::ostream& os, const time_zone& z) return os; } +inline +std::string +time_zone::name() const +{ + using namespace date; + using namespace std::chrono; + auto nm = std_abbrev_; + auto print_offset = [](seconds off) + { + std::string nm; + hh_mm_ss offset{-off}; + if (offset.is_negative()) + nm += '-'; + nm += std::to_string(offset.hours().count()); + if (offset.minutes() != minutes{0} || offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.minutes() < minutes{10}) + nm += '0'; + nm += std::to_string(offset.minutes().count()); + if (offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.seconds() < seconds{10}) + nm += '0'; + nm += std::to_string(offset.seconds().count()); + } + } + return nm; + }; + nm += print_offset(offset_); + if (!dst_abbrev_.empty()) + { + nm += dst_abbrev_; + if (save_ != hours{1}) + nm += print_offset(offset_+save_); + if (start_rule_.ok()) + { + nm += ','; + nm += start_rule_.to_string(); + nm += ','; + nm += end_rule_.to_string(); + } + } + return nm; +} + namespace detail {