diff --git a/tz.h b/tz.h index 5d75ec1..db97ac3 100644 --- a/tz.h +++ b/tz.h @@ -845,10 +845,14 @@ format(std::string format, day_point tp, const Zone* zone = nullptr) // parse +namespace detail +{ + template void parse(std::istream& is, const std::string& format, - std::chrono::time_point& tp) + std::chrono::time_point& tp, + std::string* abbrev = nullptr) { using namespace std; using namespace std::chrono; @@ -860,6 +864,7 @@ parse(std::istream& is, const std::string& format, std::tm tm{}; minutes offset{}; Duration subseconds{}; + std::string temp_abbrev; auto b = format.data(); auto i = b; @@ -925,6 +930,20 @@ parse(std::istream& is, const std::string& format, err &= ios_base::failbit; } break; + case 'Z': + if (abbrev != nullptr) + { + f.get(is, 0, is, err, &tm, b, i); + ++i; + b = i+1; + if ((err & ios_base::failbit) == 0) + { + is >> temp_abbrev; + if (is.fail()) + err &= ios_base::failbit; + } + } + break; } } } @@ -941,12 +960,35 @@ parse(std::istream& is, const std::string& format, #endif tp = floor(system_clock::from_time_t(tt) + subseconds - offset); + if (abbrev != nullptr) + *abbrev = std::move(temp_abbrev); } } is.setstate(err); } } +} // namespace detail + +template +inline +void +parse(std::istream& is, const std::string& format, + std::chrono::time_point& tp) +{ + detail::parse(is, format, tp); +} + +template +inline +void +parse(std::istream& is, const std::string& format, + std::chrono::time_point& tp, + std::string& abbrev) +{ + detail::parse(is, format, tp, &abbrev); +} + } // namespace date #endif // TZ_H