Parcourir la source

time_zone: Account for leap years

Protects against invalid hour offsets during transitions to years
following leap years.
lat9nq il y a 3 ans
Parent
commit
13755c0903
1 fichiers modifiés avec 6 ajouts et 4 suppressions
  1. 6 4
      src/common/time_zone.cpp

+ 6 - 4
src/common/time_zone.cpp

@@ -35,11 +35,13 @@ std::string GetDefaultTimeZone() {
 
 
 // Results are not comparable to seconds since Epoch
 // Results are not comparable to seconds since Epoch
 static std::time_t TmSpecToSeconds(const struct std::tm& spec) {
 static std::time_t TmSpecToSeconds(const struct std::tm& spec) {
+    const int year = spec.tm_year - 1; // Years up to now
+    const int leap_years = year / 4 - year / 100;
     std::time_t cumulative = spec.tm_year;
     std::time_t cumulative = spec.tm_year;
-    cumulative = cumulative * 365 + spec.tm_yday; // Years to days
-    cumulative = cumulative * 24 + spec.tm_hour;  // Days to hours
-    cumulative = cumulative * 60 + spec.tm_min;   // Hours to minutes
-    cumulative = cumulative * 60 + spec.tm_sec;   // Minutes to seconds
+    cumulative = cumulative * 365 + leap_years + spec.tm_yday; // Years to days
+    cumulative = cumulative * 24 + spec.tm_hour;               // Days to hours
+    cumulative = cumulative * 60 + spec.tm_min;                // Hours to minutes
+    cumulative = cumulative * 60 + spec.tm_sec;                // Minutes to seconds
     return cumulative;
     return cumulative;
 }
 }