summaryrefslogtreecommitdiff
path: root/src/common/time_zone.cpp
diff options
context:
space:
mode:
authorGravatar lat9nq2023-07-12 02:34:02 -0400
committerGravatar lat9nq2023-07-12 02:34:02 -0400
commit13755c09036aefe9209360bf0a94c3e2a83e12b8 (patch)
tree893fcca0318e4e7162f875e8f6d44d36f29ff942 /src/common/time_zone.cpp
parentsettings: Disable C++20 tzdb path on MinGW (diff)
downloadyuzu-13755c09036aefe9209360bf0a94c3e2a83e12b8.tar.gz
yuzu-13755c09036aefe9209360bf0a94c3e2a83e12b8.tar.xz
yuzu-13755c09036aefe9209360bf0a94c3e2a83e12b8.zip
time_zone: Account for leap years
Protects against invalid hour offsets during transitions to years following leap years.
Diffstat (limited to 'src/common/time_zone.cpp')
-rw-r--r--src/common/time_zone.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/common/time_zone.cpp b/src/common/time_zone.cpp
index a25f8b040..1ee63bf80 100644
--- a/src/common/time_zone.cpp
+++ b/src/common/time_zone.cpp
@@ -35,11 +35,13 @@ std::string GetDefaultTimeZone() {
35 35
36// Results are not comparable to seconds since Epoch 36// Results are not comparable to seconds since Epoch
37static std::time_t TmSpecToSeconds(const struct std::tm& spec) { 37static std::time_t TmSpecToSeconds(const struct std::tm& spec) {
38 const int year = spec.tm_year - 1; // Years up to now
39 const int leap_years = year / 4 - year / 100;
38 std::time_t cumulative = spec.tm_year; 40 std::time_t cumulative = spec.tm_year;
39 cumulative = cumulative * 365 + spec.tm_yday; // Years to days 41 cumulative = cumulative * 365 + leap_years + spec.tm_yday; // Years to days
40 cumulative = cumulative * 24 + spec.tm_hour; // Days to hours 42 cumulative = cumulative * 24 + spec.tm_hour; // Days to hours
41 cumulative = cumulative * 60 + spec.tm_min; // Hours to minutes 43 cumulative = cumulative * 60 + spec.tm_min; // Hours to minutes
42 cumulative = cumulative * 60 + spec.tm_sec; // Minutes to seconds 44 cumulative = cumulative * 60 + spec.tm_sec; // Minutes to seconds
43 return cumulative; 45 return cumulative;
44} 46}
45 47