
Issue #21144 has been updated by ufuk (Ufuk Kayserilioglu). Backport changed from 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED, 3.4: REQUIRED to 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED, 3.4: DONE ruby_3_4 commit:d40c6cf7b606edb815adf7a8e9abe98f38a8f747. ---------------------------------------- Bug #21144: Win32: Use Windows time zone ID as the time zone name if TZ is not set https://bugs.ruby-lang.org/issues/21144#change-112185 * Author: nobu (Nobuyoshi Nakada) * Status: Closed * Assignee: windows * Backport: 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED, 3.4: DONE ---------------------------------------- ### Problem On Windows, the `Time#zone` uses `_tzname` provided by the runtime library. This is obtained by using `GetTimeZoneInformation`, if the `TZ` environment variable is not set or empty. The problem is that the `StandardName` and `DaylightName` in that information are for UI, and localized. This means that these names may vary across different international editions and language packs, even for the same time zone. ### Solution Use the Windows time zone ID by using `GetDynamicTimeZoneInformation`, which is available since Windows Vista and Windows Server 2008. Since the `TimeZoneKeyName` is the registry key of time zones, the above problem does not occur. This is also mitigate [Bug #20929]. Even it is possible to define non-ascii key name time zone, there is no such name in the standard installations. ### Compatibilities etc - This also changes the result of `Time#inspect`, may not be good for ones who prefer the display names for UI. - There is no way to restore `zone` from `Marshal` data, this does *not* improve. - The PR [GH-12765] changes the signature of `ruby_reset_timezone()` and marks internal use only, but this function is declared in `internal/time.h` and probably no problem. [GH-12765]: https://github.com/ruby/ruby/pull/12765 -- https://bugs.ruby-lang.org/