2016-09-21 6 views
1

При попытке разграничения между часовым поясом Марии и Аризоной (я понимаю, что они оба являются Mountain Time), я обнаружил, что GetNamesForTimeZone («Америка/Феникс», «en-us») вернул дневной свет имя.TimeZoneNames standard, daylight, generic uses

Должен ли я полагаться на внешний код (время ноды), чтобы выяснить, является ли время дневного света для этого часового пояса или есть способ узнать только из функций TimeZoneNames, если в зоне нет летнего времени?

На этой же заметке, какой прецедент используется для использования «общего» имени для имени часового пояса вместо стандартного и дневного света?

+0

Вы имеете в виду использование https://github.com/mj1856/TimeZoneNames? Пока неясно, как выглядит ваш код на данный момент. Было бы полезно использовать [mcve]. –

ответ

2

Насколько я могу судить, TimeZoneNames - это всего лишь имена самих часовых поясов - он ничего не знает о самих данных часового пояса.

Если вы хотите знать, является ли Америка/Phoenix в настоящее время наблюдения сбережения дневного света, я бы определенно использовать сам Нода Время:

// Usually pass in System.Clock.Instance as the clock... 
// or take an Instant instead. 
public bool IsCurrentlyObservingDaylightSavings(string id, IClock clock) 
{ 
    var zone = DateTimeZoneProviders.Tzdb[id]; 
    var now = clock.Now; 
    var zoneInterval = zone.GetZoneInterval(now); 
    return zoneInterval.Savings != Offset.Zero; 
} 

Я вполне может добавить метод DateTimeZone.InDaylightSaving(Instant) 2,0 ...

+0

Вот что я думал об этом. Thanks –

1

Как автор библиотеки TimeZoneNames, я могу объяснить, почему это происходит.

Во-первых, America/Phoenix карты к America_Mountain metazone в the CLDR metaZones.xml file

<timezone type="America/Phoenix"> 
    <usesMetazone mzone="America_Mountain"/> 
</timezone> 

Другие часовых поясов также в одной и той же мета зоне:

<timezone type="America/Denver"> 
    <usesMetazone mzone="America_Mountain"/> 
</timezone> 

Затем в каждом файле языка CLDR, такие как the en.xml file для английского языка вы увидите запись метазона с ее локализованными строками:

Итак, в CLDR нет информации о том, применим ли DST в Аризоне или нет. Имейте в виду, что в Аризоне действительно был DST в прошлом - last in 1967. Таким образом, без данных TZDB, которые вы найдете в Noda Time, вы не можете определить, действует ли DST или нет в определенный момент времени.

Jon's answer показывает, как вы будете тестировать, если DST действует с использованием Noda Time. После того, как вы получите результат, вы можете выбрать стандартную или дневную строку из TimeZoneNames соответственно.

Что касается общего имени, которое обычно используется, когда человек относится к часовому поясу в целом, а не к части времени дневного света или к стандартной части времени. Один вариант использования - выбор часового пояса, например, демонстрируется here.

+0

Thanks Matt. Если у меня есть еще один вопрос о вашей библиотеке TimeZoneNames (я получаю сообщение об ошибке в Silverlight, когда НЕ с повышенным доверием). Какой тег я должен использовать, чтобы вы смотрели на него, или я должен отправлять его прямо в github для TimeZoneNames? Просто хотел убедиться, что у вас есть видимость. Поскольку Silverlight больше не поддерживается, вы можете даже не учитывать его (наши WPF и Silverlight имеют некоторый общий код), но я думал, что попрошу. –

+0

Хммм .. Опубликовать, конечно. Я посмотрю, когда смогу. Однако никаких обещаний.:) –

+0

Записан как проблема в git repo для библиотеки TimeZoneNames. –