Browse Source

Fix DST Error on Windows

(cherry picked from commit 4802f152317e5750f6d55a1cae621c9908dbdab5)
ztco224 3 years ago
parent
commit
b86b4e5004
1 changed files with 13 additions and 3 deletions
  1. 13 3
      platform/windows/os_windows.cpp

+ 13 - 3
platform/windows/os_windows.cpp

@@ -2416,12 +2416,19 @@ OS::Date OS_Windows::get_date(bool utc) const {
 	else
 	else
 		GetLocalTime(&systemtime);
 		GetLocalTime(&systemtime);
 
 
+	// Get DST information from Windows, but only if utc is false.
+	TIME_ZONE_INFORMATION info;
+	bool daylight = false;
+	if (!utc && GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT) {
+		daylight = true;
+	}
+
 	Date date;
 	Date date;
 	date.day = systemtime.wDay;
 	date.day = systemtime.wDay;
 	date.month = Month(systemtime.wMonth);
 	date.month = Month(systemtime.wMonth);
 	date.weekday = Weekday(systemtime.wDayOfWeek);
 	date.weekday = Weekday(systemtime.wDayOfWeek);
 	date.year = systemtime.wYear;
 	date.year = systemtime.wYear;
-	date.dst = false;
+	date.dst = daylight;
 	return date;
 	return date;
 }
 }
 OS::Time OS_Windows::get_time(bool utc) const {
 OS::Time OS_Windows::get_time(bool utc) const {
@@ -2444,16 +2451,19 @@ OS::TimeZoneInfo OS_Windows::get_time_zone_info() const {
 	if (GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT)
 	if (GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT)
 		daylight = true;
 		daylight = true;
 
 
+	// Daylight Bias needs to be added to the bias if DST is in effect, or else it will not properly update.
 	TimeZoneInfo ret;
 	TimeZoneInfo ret;
 	if (daylight) {
 	if (daylight) {
 		ret.name = info.DaylightName;
 		ret.name = info.DaylightName;
+		ret.bias = info.Bias + info.DaylightBias;
 	} else {
 	} else {
 		ret.name = info.StandardName;
 		ret.name = info.StandardName;
+		ret.bias = info.Bias + info.StandardBias;
 	}
 	}
 
 
 	// Bias value returned by GetTimeZoneInformation is inverted of what we expect
 	// Bias value returned by GetTimeZoneInformation is inverted of what we expect
-	// For example on GMT-3 GetTimeZoneInformation return a Bias of 180, so invert the value to get -180
-	ret.bias = -info.Bias;
+	// For example, on GMT-3 GetTimeZoneInformation return a Bias of 180, so invert the value to get -180
+	ret.bias = -ret.bias;
 	return ret;
 	return ret;
 }
 }