[vm] Fix DateTime.timeZoneName on Windows It needs to look at the given moment to decide whether to use summer time zone name or standard time zone name. Previously it was looking at the current time to make this decision which produced incorrect result: e.g. given `DateTime.parse(2012-01-02T13:45:23)` its `timeZoneName` should be returning standard name corresponding to the current time zone even if we are currently running in summer time (e.g. it should return PST if machine it is running on is in PDT). This is revealed by a test which started to fail on Windows because our Windows bots entered PDT. Fixes https://github.com/dart-lang/sdk/issues/55159 TEST=corelib/date_time7_test.dart CoreLibraryReviewExempt: No core library changes. Change-Id: Ic938baf837c2f6130ec3f9604631701267369f87 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/356681 Reviewed-by: Alexander Aprelev <aam@google.com> Commit-Queue: Slava Egorov <vegorov@google.com>
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc index 9daec00..9e5ea55 100644 --- a/runtime/vm/os_win.cc +++ b/runtime/vm/os_win.cc
@@ -112,13 +112,11 @@ } // Figure out whether we're in standard or daylight. - bool daylight_savings = (status == TIME_ZONE_ID_DAYLIGHT); - if (status == TIME_ZONE_ID_UNKNOWN) { - tm local_time; - if (LocalTime(seconds_since_epoch, &local_time)) { - daylight_savings = (local_time.tm_isdst == 1); - } + tm local_time; + if (!LocalTime(seconds_since_epoch, &local_time)) { + return ""; } + const bool daylight_savings = (local_time.tm_isdst == 1); // Convert the wchar string to a null-terminated utf8 string. wchar_t* wchar_name = daylight_savings ? zone_information.DaylightName
diff --git a/tests/corelib/date_time7_test.dart b/tests/corelib/date_time7_test.dart index f59236a..41f8a94 100644 --- a/tests/corelib/date_time7_test.dart +++ b/tests/corelib/date_time7_test.dart
@@ -21,6 +21,8 @@ // // Hardcode some common timezones, in both their abbreviated and expanded // forms to account for differences between host platforms. + print(name); + print(offset); switch (name) { case "CET" || "Central European Time" || "Central European Standard Time": Expect.equals(1, offset.inHours); @@ -34,6 +36,8 @@ Expect.equals(-4, offset.inHours); case "PDT" || "Pacific Daylight Time": Expect.equals(-7, offset.inHours); + case "PST" || "Pacific Standard Time": + Expect.equals(-8, offset.inHours); case "CST" || "Central Standard Time": Expect.equals(-6, offset.inHours); case "CDT" || "Central Daylight Time":