Skip to content

Commit

Permalink
[vm] Fix DateTime.timeZoneName on Windows
Browse files Browse the repository at this point in the history
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 #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>
  • Loading branch information
mraleph authored and Commit Queue committed Mar 11, 2024
1 parent d58f6a1 commit b0236fd
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 6 deletions.
10 changes: 4 additions & 6 deletions runtime/vm/os_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,11 @@ const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
}

// 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
Expand Down
4 changes: 4 additions & 0 deletions tests/corelib/date_time7_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ testLocal() {
//
// 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);
Expand All @@ -34,6 +36,8 @@ testLocal() {
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":
Expand Down

0 comments on commit b0236fd

Please sign in to comment.