Noda время iana сопоставление Etc/UTC к часовому поясу Windows

У меня есть глобальный веб-сайт, который передает идентификатор часового пояса IANA на сервер и использует Noda Time для сопоставления с часовым поясом Windows в веб-приложении С# 5.

"Etc/UTC" передается на сервер, но Noda Time не может сопоставить его с часовым поясом Windows. Как я могу сопоставить идентификатор часового пояса IANA?

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;
}

Ответы

Ответ 1

Как указал Джон, отображение CLDR не существует для "Etc/UTC". Вместо этого CLDR отображает часовой пояс Windows "UTC" на "Etc/GMT". IMHO - это ошибка.

CLDR требует "стабильных идентификаторов", поэтому он не традиционно обновлял свои сопоставления при изменении имен часовых поясов. Вместо этого, как правило, следует следовать "ссылкам" в базе данных часового пояса для отображения в канонической зоне.

Однако - TZDB не считает, что "Etc/GMT" является ссылкой для "Etc/UTC". Это две разные зоны. Там также "Etc/UCT". Это значит, что приложения, которые полагаются на TZDB для сокращений часового пояса, могут использовать свой выбор аббревиатуры (GMT, UTC или UCT). (См. обсуждение здесь.)

В любом случае - спасибо, что напомнили нам об этой проблеме. Я обновил функции отображения , чтобы принять это во внимание.