noda time是Etc/UTC到Windows时区的映射

本文关键字:Windows 时区 映射 UTC time Etc noda | 更新日期: 2023-09-27 18:10:04

我有一个全球网站,它正在传递IANA时区id到服务器,并使用Noda时间映射到c# 5 web应用程序中的Windows时区。

"Etc/UTC"正在传递给服务器,但Noda Time无法将其映射到Windows时区。如何映射IANA时区id?

public TimeZoneInfo GetTimeZoneByIanaId(string ianaTimeZoneId)
{
    TzdbDateTimeZoneSource timeZoneSource = TzdbDateTimeZoneSource.Default;
    IList<MapZone> zoneMaps = timeZoneSource.WindowsMapping.MapZones;
    // resolve any link, since the CLDR doesn't necessarily use canonical IDs
    IList<string> mapZoneIds = timeZoneSource.CanonicalIdMap.Where(map => map.Value.Equals(ianaTimeZoneId, StringComparison.OrdinalIgnoreCase)).Select(x => x.Key).ToList();
    MapZone mapZone = zoneMaps.FirstOrDefault(zoneMap => zoneMap.TzdbIds.Any(mapZoneIds.Contains));
    if (mapZone == null)
    {
        throw new TimeZoneNotFoundException("Unable to determine the clients timezone using the jsTimezoneDetect plugin");
    }
    TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(mapZone.WindowsId);
    if (timeZone == null)
    {
        throw new TimeZoneNotFoundException("Unable to determine the clients timezone from NodaTime");
    }
    return timeZone;
}

noda time是Etc/UTC到Windows时区的映射

正如Jon指出的那样,"Etc/UTC"没有CLDR映射。相反,CLDR将Windows的"UTC"时区映射为"Etc/GMT"时区。IMHO -这是错误的。

CLDR需要"稳定的标识符",所以当时区名称改变时,它通常不会更新它的映射。相反,人们通常会按照时区数据库中的"链接"来映射到规范区域。

然而,TZDB不认为"Etc/GMT""Etc/UTC"的链接。它们是两个不同的区域。还有"Etc/UCT"。这样,依赖TZDB的时区缩写的应用程序就可以使用自己选择的缩写(GMT、UTC或UCT)。(见此处讨论)

无论如何,谢谢你提醒我们这个问题。考虑到这一点,我更新了映射函数