2014-12-19 97 views
0

当我检查此属性...不一致区域标识野田

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")); 

在上面的例子中,它确实返回了“美国”条目 - 例如“America/Phoenix” - 但所有的“US”条目都没有了。

为什么?

诸如“美国/东部”或“美国/太平洋”之类的“美国”值是地图中最重要的值之一 - 但它们不在那里。我不明白。

回答

1

几件事:

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

    list on Wikipedia显示所有区域和链接,并指示哪些链接指向哪些规范区域。例如,“美国/太平洋”是指向“美国/洛杉矶”的链接。

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

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

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