不确定是否superuser.com
是合适的 StackExchange 站点来提出这个问题;如果没有,请向我推荐最合适的网站。
Windows 附带的时区的来源是什么?为了举例,我将在这里列出一些(来自使用 PowerShell,但信息不是特定于 .NET):
PS C:\Users> [TimeZoneInfo]::FindSystemTimeZoneById("W. Europe Standard Time")
Id : W. Europe Standard Time
HasIanaId : False
DisplayName : (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
StandardName : W. Europe Standard Time
DaylightName : W. Europe Daylight Time
BaseUtcOffset : 01:00:00
SupportsDaylightSavingTime : True
PS C:\Users> [TimeZoneInfo]::FindSystemTimeZoneById("Central Europe Standard Time")
Id : Central Europe Standard Time
HasIanaId : False
DisplayName : (UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
StandardName : Central Europe Standard Time
DaylightName : Central Europe Daylight Time
BaseUtcOffset : 01:00:00
SupportsDaylightSavingTime : True
PS C:\Users> [TimeZoneInfo]::FindSystemTimeZoneById("Romance Standard Time")
Id : Romance Standard Time
HasIanaId : False
DisplayName : (UTC+01:00) Brussels, Copenhagen, Madrid, Paris
StandardName : Romance Standard Time
DaylightName : Romance Daylight Time
BaseUtcOffset : 01:00:00
SupportsDaylightSavingTime : True
PS C:\Users> [TimeZoneInfo]::FindSystemTimeZoneById("Central European Standard Time")
Id : Central European Standard Time
HasIanaId : False
DisplayName : (UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb
StandardName : Central European Standard Time
DaylightName : Central European Daylight Time
BaseUtcOffset : 01:00:00
SupportsDaylightSavingTime : True
所有这四个条目 ( "W. Europe Standard Time", "Central Europe Standard Time", "Romance Standard Time", "Central European Standard Time"
) 本质上是等价的,但在几个方面令人困惑。这里有些例子:
- W. 欧洲标准时间这个名字经常用于里斯本、伦敦等地的 UTC±00:00,那么这个名字是从哪里来的呢?
- 第三个中的浪漫这个词很奇怪。提到的一个城市(哥本哈根)使用一种非罗曼语(丹麦语,一种日耳曼语),而另一个具有明显罗曼语关联的城市(罗马,罗曼语的名称来源于此)在另一个条目中。
- 组没有任何意义。比如为什么阿姆斯特丹和布鲁塞尔在不同的组?为什么斯德哥尔摩和阿姆斯特丹一起去,而哥本哈根和布鲁塞尔一起去?
- 如果您在奥斯陆(未提及),您会选择哥本哈根还是斯德哥尔摩?
- 中欧标准时间和中欧标准时间的名称非常相似?为什么萨格勒布没有与卢布尔雅那合并;巴尔干半岛的城市完全随机分布在两组之间?
所以我的主要问题是,这些群体的解释是什么?是否有从tz 数据库条目到 Windows 使用的组的映射?
可以在 Microsoft 文章 Introducing New Windows Time Zones from 2019 中找到解释:
答案在本质上是历史性的——当国家改变他们的规则时,微软可能会创建包含它们的新组,或者将它们移动到另一个组。规则可能包括夏令时日期或任何可能改变 Windows 需要为该国家/地区设置的时间的任何内容。
当规则发生变化时,微软似乎并没有统一组,而是更喜欢保留以前的组,即使多个组中的条目今天使用相同的时区。
我相信浪漫是指适用于典型地理区域/司法管辖区的语言群体。(如“Suisse Romande”,该术语用于指代瑞士的法语区。)罗曼语是一种直接源自拉丁语的语言,请参阅https://en.wikipedia.org/wiki/Romance_languages。奇怪的是,给定时区的详细信息不匹配,或部分匹配。我想当这个标签有意义时,它从特定的司法管辖区开始,然后随着 DST 规则的改变,它偏离了原来的组成——例如,丹麦/丹麦很难成为一个讲拉丁语的国家。
是的。
通俗地说,是的 - “西欧时间”适用于 UTC+0 的几个地方。但是,Windows 认为那是 UTC+1。伦敦和里斯本的 Windows 时区 ID 是
"GMT Standard Time"
。这是一个错误,已经被数据记录在案了。
我认为这是一个延伸。最先提出这个区域条目的人更有可能认为巴黎是一个浪漫的地方。(是的,我是认真的。)
除了在选择标识符时有一长串欧洲国家和具有相同时区的相应城市之外,没有其他原因。我推测它们被分成四个以保持下拉列表在 UI 中可见,而不会使其变得超宽,或者通过删除其中一个来扰乱任何人。
我不能说一个人会做什么,但正确的映射应该是斯德哥尔摩。(
W. Europe Standard Time
)是的。
我对此进行了大量研究,我能提供的唯一合理答案是:随着时间的推移,人类行为通常被视为随意性。因此,“事后诸葛亮是 20/20”。
考虑到使用这些数据的第一个 API 是最早版本的 Windows NT 的一部分。虽然 tz 数据库项目当时存在,但它并不像今天那样无处不在。微软也没有采用开源技术的文化,也没有对具有像时区这样深奥的系统之间的互操作性很感兴趣。
甚至稍微考虑历史时区更改都需要更长的时间(Windows Vista 在注册表项中添加了“动态 DST”)。
一般来说,唯一的动机是让任务栏上的时钟正确,因为微软在其中销售 Windows支持合同。如果您在其他时区使用 Windows,您可能没有渠道让 Microsoft 的某个人相信这是一个值得花费工程资金解决的重要问题。
由于时区在地图上的标记方式,微软还遇到了影响产品销售的重大问题。(有关更多详细信息,请参阅此博客或此较旧的 tz 列表帖子。)
随着时间的推移,越来越多的时区被添加到列表中。有时更改是应客户要求,有时是响应政府对标准偏移或 DST 规则的更改。有时这些变化是较大项目的一部分,有时是一次性的。通常由不同的团队遵循他们认为正确的做法,但不一定与先例保持一致(例如:“俄罗斯时区 X”编号区域)。
好消息是,世界发生了变化,而微软已经走了很长一段路。.NET 等技术已尽可能采用 IANA 时区。在 WinRT/UWP 等多个领域,Windows 本身也是如此。2016年在微软工作,帮助Windows团队填补空白。现在,地球上的任何人都可以尽可能多地选择合理有效的时区(以与微软修订后的使命声明保持一致:)
"to empower every person and every organization on the planet to achieve more"
。《连线》杂志上有一篇关于这些人的可爱文章。我不再在那里工作,但我帮助制定的政策继续支持随着时间的推移保持更新的努力。您可以在 Microsoft DST/TZ 博客上关注他们的工作。是的。事实标准映射是
windowsZones.xml
在 Unicode CLDR 项目中找到的文件。Windows 本身以及 .NET、许多第三方库以及几乎所有运行ICU的东西都使用它。在 .NET 6+ 中,在非 Windows 系统或包含 ICU 的现代 Windows 系统上运行时,您可以只使用 IANA 标识符并将遗留转换排除在您的程序之外。还有我的TimeZoneConverter库,无论 .NET 版本或操作系统如何,它都可以做很多相同的事情。
大约 10 年前,我在 Microsoft 知识库中有一篇关于此的文章。
我做了一些挖掘,但我无法再次找到那篇文章。
据我记得:
阿姆斯特丹和布鲁塞尔现在可能实际上是同一个时区,但过去不是。
为了进行可以追溯到那些日子的日期时间计算,正常工作,需要维护这些单独的时区,即使今天它们在功能上是等效的。
(我认为同样的事情也适用于其他时区。)
至于奇怪的名称和奇怪的区域:这些也是历史性的,出于兼容性原因而保留。