当我检查这个属性时......
var t = DateTimeZoneProviders.Tzdb.Ids;
...它包含的值如下:
但是当我访问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”条目都已消失。
为什么?
“美国/东方”或“美国/太平洋”等“美国”价值观是地图中最重要的价值之一 - 但它们并不存在。我不明白。
答案 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