Noda中不一致的区域标识符

时间:2014-12-19 01:45:45

标签: c# globalization nodatime

当我检查这个属性时......

var t = DateTimeZoneProviders.Tzdb.Ids;

...它包含的值如下:

  • US /阿拉斯加
  • US /东部
  • US /夏威夷
  • US /太平洋
  • US /亚利桑那
  • 美国/丹佛
  • 美国/芝加哥
  • 美国/菲尼克斯
  • 美国/ 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"));

在上面的示例中,它确实返回“America”条目 - 例如“America / Phoenix” - 但所有“US”条目都已消失。

为什么?

“美国/东方”或“美国/太平洋”等“美国”价值观是地图中最重要的价值之一 - 但它们并不存在。我不明白。

1 个答案:

答案 0 :(得分:1)

一些事情:

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

    list on Wikipedia显示所有区域和链接,并指示哪些链接指向哪个规范区域。例如,“US / Pacific”是指向“America / Los_Angeles”的链接。

    the tzdb sources中,使用Link关键字标识链接。您会在US/*文件中找到backward个区域。您还可以找到散布在其他文件周围的其他链接,通常位于关联的区域定义附近。

  • Noda Time中的WindowsMapping课程公开the Unicode CLDR windows zone mapping data。 CLDR对TZDB的规范有不同的看法。像US/Eastern这样的区域不是标准的规范,而是以印度为例。 TZDB使用最新的Asia/Kolkata作为规范区域,而Asia/Calcutta是一个链接。但由于Asia/Calcutta是原始值,因此CLDR认为是规范的。因此,您在Noda Time中的Asia/Kolkata数据中找不到WindowsMapping。您必须先将区域解析为TZDB使用的区域。

  • 我已经完成了Noda Time的功能,并考虑了所有这些因素。 You can find them here