野田中的区域标识符不一致

本文关键字:标识符 不一致 区域 田中 | 更新日期: 2023-09-27 18:34:37

当我检查此属性时...

var t = DateTimeZoneProviders.Tzdb.Ids;

。它包含以下值:

  • 美国/阿拉斯加
  • 美国/东部
  • 美国/夏威夷
  • 美国/太平洋
  • 美国/亚利桑那州
  • 美洲/丹佛
  • 美洲/芝加哥
  • 美洲/凤凰城
  • 美洲/Los_Angelos

但是当我访问MapZones时,所有"US"条目都消失了:

var mappings = TzdbDateTimeZoneSource.Default.WindowsMapping.MapZones;
var stuff = mappings.SelectMany(w => w.TzdbIds)
      .Where(v => v.StartsWith("America") || v.StartsWith("US"));

在上面的示例中,它确实返回"美国"条目 - 例如"美国/凤凰城" - 但所有"美国"条目都消失了。

为什么?

"美国"值,如"美国/

东部"或"美国/太平洋"是地图中最重要的值之一 - 但它们不存在。 我不明白。

野田中的区域标识符不一致

几件事:

  • US/*这样的区域主要在 TZDB 中,以实现向后兼容性。 它们是与规范区域的"链接",而不是区域本身。 这些是有效的标识符,但通常应避免将它们用于新开发。

    维基百科上的列表显示了所有区域和链接,并指出哪些链接指向哪些规范区域。 例如,"美国/太平洋"是指向"美国/Los_Angeles"的链接。

    在 tzdb 源中,链接使用 Link 关键字标识。 您将在backward文件中找到US/*区域。 您还会发现其他链接分散在其他文件周围,通常在关联的区域定义附近。

  • Noda Time 中的 WindowsMapping 类公开了 Unicode CLDR 窗口区域映射数据。 CLDR对什么是规范的想法与TZDB不同。 像US/Eastern这样的区域在任何一个标准上都不是规范的,但以印度为例。 TZDB使用最新的Asia/Kolkata作为规范区域,而Asia/Calcutta是一个链接。 但由于Asia/Calcutta是原始值,CLDR 认为这是规范的。 因此,您不会在野田时间的WindowsMapping数据中找到Asia/Kolkata。 您必须首先将区域解析为 TZDB 使用的区域。

  • 我已经完成了 Noda Time 的函数,其中考虑了所有这些因素。 你可以在这里找到它们。