diff options
Diffstat (limited to 'absl/time/time.cc')
-rw-r--r-- | absl/time/time.cc | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/absl/time/time.cc b/absl/time/time.cc index 2c7da3ad..6bb36cb3 100644 --- a/absl/time/time.cc +++ b/absl/time/time.cc @@ -47,7 +47,7 @@ namespace cctz = absl::time_internal::cctz; namespace absl { -inline namespace lts_2019_08_08 { +ABSL_NAMESPACE_BEGIN namespace { @@ -431,9 +431,17 @@ absl::TimeConversion ConvertDateTime(int64_t year, int mon, int day, int hour, } absl::Time FromTM(const struct tm& tm, absl::TimeZone tz) { - const CivilSecond cs(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - const auto ti = tz.At(cs); + civil_year_t tm_year = tm.tm_year; + // Avoids years that are too extreme for CivilSecond to normalize. + if (tm_year > 300000000000ll) return InfiniteFuture(); + if (tm_year < -300000000000ll) return InfinitePast(); + int tm_mon = tm.tm_mon; + if (tm_mon == std::numeric_limits<int>::max()) { + tm_mon -= 12; + tm_year += 1; + } + const auto ti = tz.At(CivilSecond(tm_year + 1900, tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec)); return tm.tm_isdst == 0 ? ti.post : ti.pre; } @@ -487,5 +495,5 @@ struct tm ToTM(absl::Time t, absl::TimeZone tz) { return tm; } -} // inline namespace lts_2019_08_08 +ABSL_NAMESPACE_END } // namespace absl |