Правильный идентификатор зоны для восточного времени (ET): "США / Восточная" или "Америка / Нью-Йорк"? - PullRequest
2 голосов
/ 25 июня 2019

Я должен использовать часовой пояс "ET" (восточное время).В Java нет ZoneId.of ("ET").

Какой из них следует использовать для правильного представления "ET":

ZoneId TIMEZONE_ET = ZoneId.of("US/Eastern");

или

ZoneId TIMEZONE_ET = ZoneId.of("America/New_York");

Ответы [ 3 ]

5 голосов
/ 25 июня 2019

Учитывая, что вы должны использовать «Восточную зону», я бы использовал US/Eastern, но обратите внимание:

  • Это просто ссылка на America/New_York.
  • Этот файл в репозитории Пола Эггерта tz говорит, что эти ссылки должны связывать «старые» имена (например, США / Восточная) с текущими именами. «Старый» вполне может означать «устарел» в этом контексте. Пол Эггерт - координатор TZ для списка часовых поясов IANA, так что это явно канонический источник.

Учитывая это, вам, вероятно, лучше всего использовать America/New_York, но, учитывая, что это изменение относится к 1993 году, очевидно, что старые имена не исчезнут в ближайшее время.

Либо будет содержать правила DST и т. Д. В моей системе, например:

var zoneRules = ZoneId.of("US/Eastern").getRules();
System.out.println(zoneRules.isDaylightSavings(Instant.parse("2019-07-01T12:00:00Z"))); // true
System.out.println(zoneRules.isDaylightSavings(Instant.parse("2019-01-01T12:00:00Z"))); // false

Обратите внимание, что полдень 1 июля - в летнее время, а полдень 1 января - нет.

Подробнее:

В файлах базы данных IANA Time Zone я обнаружил:

to2050.tzs

Link America/New_York    US/Eastern

... что означает, что оба являются псевдонимами (хотя ZoneId#equals не возвращает true для них). Кроме того, в northamerica они имеют:

# US eastern time, represented by New York

с примечаниями со ссылкой на соответствующий закон.

Так что мне кажется, что на данный момент они являются синонимами. Также ясно, что US/Eastern - это «старое имя». Конечно, в теории , Нью-Йорк мог бы в какой-то момент принять решение не быть частью восточного часового пояса (возможно, ближе, по времени, к Великобритании и Европе), но это кажется действительно вряд ли ...

3 голосов
/ 26 июня 2019

America / New_York

Ответ находится в Списке часовых поясов базы данных tz : США / Восток устарели и являются просто ссылкой на Америку / New_York.Поэтому, чтобы быть уверенным в будущей совместимости, вы должны использовать America / New_York.

Об аббревиатуре, ET

Поскольку я почувствовал сомнение в нескольких комментариях: североамериканское восточное время может быть иобычно сокращенно ET.Один из способов убедиться в этом - в Сокращения часовых поясов - всемирный список .Вы также можете видеть, что ET может или содержать как EST (восточное стандартное время), так и EDT (восточное дневное время) или использоваться в качестве синонима для EST, также известного как Tiempo del Esteна испанском.Изучая список, вы также увидите, что очень много сокращений неоднозначны.

Или в Java (с использованием REPL):

jshell> ZoneId.of("America/New_York").getDisplayName(TextStyle.SHORT, Locale.US) 
$3 ==> "ET"

Просто из любопытства и не рекомендуется из-зариск двусмысленности: вы также можете пойти другим путем и получить ZoneId от сокращения:

jshell> var dtf = DateTimeFormatter.ofPattern("z", Locale.US);
dtf ==> ZoneText(SHORT)

jshell> ZoneId.from(dtf.parse("ET"))
$7 ==> America/New_York

Я повторяю: не пытайтесь использовать этот последний трюк дома.

1 голос
/ 25 июня 2019

Если вы сделаете:

System.out.println(TimeZone.getTimeZone(("US/Eastern")));
System.out.println(TimeZone.getTimeZone(("America/New_York")));

Вывод:

sun.util.calendar.ZoneInfo[id="US/Eastern",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=US/Eastern,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]


sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]

, который показывает, что каждое установленное значение равно точно одинаково.Нет никакой разницы между этими двумя.

Однако, благодаря комментарию Андреаса, было бы оптимальным использовать America/New_York вместо US/Eastern, поскольку это устарело, показано здесь и официальноlist здесь .

Согласно официальному списку на github, созданному автором базы данных, US/Eastern существует исключительно для обратной совместимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...