Project

General

Profile

Bug #21144

Updated by nobu (Nobuyoshi Nakada) 6 days ago

### 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] PR 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. 

 [PR]: https://github.com/ruby/ruby/pull/12765 

Back