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). (См. обсуждение здесь.)
В любом случае - спасибо, что напомнили нам об этой проблеме. Я обновил функции отображения , чтобы принять это во внимание.