diff --git a/src/time/Zone.cxx b/src/time/Zone.cxx index 9165a10d0..534657436 100644 --- a/src/time/Zone.cxx +++ b/src/time/Zone.cxx @@ -32,19 +32,35 @@ #include "Zone.hxx" +#ifdef _WIN32 +#include +#include +#include +#else #include +#endif int GetTimeZoneOffset() noexcept { - time_t t = 1234567890; #ifdef _WIN32 - struct tm *p = gmtime(&t); + TIME_ZONE_INFORMATION TimeZoneInformation; + DWORD tzi = GetTimeZoneInformation(&TimeZoneInformation); + + int offset = -TimeZoneInformation.Bias * 60; + if (tzi == TIME_ZONE_ID_STANDARD) + offset -= TimeZoneInformation.StandardBias * 60; + + if (tzi == TIME_ZONE_ID_DAYLIGHT) + offset -= TimeZoneInformation.DaylightBias * 60; + + return offset; #else + time_t t = 1234567890; struct tm tm; tm.tm_isdst = 0; struct tm *p = &tm; gmtime_r(&t, p); -#endif return t - mktime(p); +#endif }