Чем часовой пояс EST отличается от EST5EDT?

Насколько отличается EST от EST5EDT? Разве EST не учитывает летнее время?

Я написал небольшой фрагмент Java, чтобы выяснить разницу, и вывод говорит, что EST5EDT учитывает летнее время, а EST - нет.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss.SSS"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("EST5EDT")); 
System.out.println("EST5EDT" +dateFormat.format(new Date()));
    /* prints EST5EDT2013-Apr-05 02:24:16.471 */  


dateFormat = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss.SSS"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("EST")); 
System.out.println("EST "+dateFormat.format(new Date()));
   /*prints EST 2013-Apr-05 01:24:16.472 */

Но приведенный ниже фрагмент произвел шокирующий результат

System.out.println("EST5EDT offset "+TimeZone.getTimeZone("EST5EDT").getRawOffset()/(60*60*1000));
/* prints 5 instead of 4 (DST) */

Может кто-нибудь объяснить, что именно здесь происходит? почему getRawOffset возвращает 5 вместо 4? Как получить смещение часового пояса с DST?


person Jeevan    schedule 05.04.2013    source источник
comment
По возможности избегайте идентификаторов стиля EST и EST5EDT. Вместо этого используйте America/New_York и связанные с ним идентификаторы. см. здесь и дублирующий пост.   -  person Matt Johnson-Pint    schedule 05.04.2013


Ответы (1)


Разве EST не учитывает летнее время?

Нет. По определению EST — это «восточное стандартное время» или UTC-5:00.

EDT — это «восточное летнее время» или UTC-4:00.

Это немного сбивает с толку, потому что, например, Нью-Йорк переключается между EST и EDT, а Сиэтл переключается между PST и PDT.

Иногда люди неправильно говорят: «Я позвоню вам в 13:00 по восточному стандартному времени», когда на самом деле они хотят сказать: «Я позвоню вам в 13:00 по восточному времени», что должным образом учитывает, является ли это переходом на летнее время или нет.

Эта вики-страница содержит немного больше информации.

почему getRawOffset возвращает 5 вместо 4

Timezone.getRawOffset всегда возвращает число миллисекунд для стандартного времени, которое равно 5 * (60 * 60 * 1000)

Поскольку смещение UTC изменяется в зависимости от дня года (для учета перехода на летнее время), вам необходимо использовать getOffset и укажите дату, которую вы хотите использовать. .

person Alan    schedule 05.04.2013
comment
Спасибо, что развеяли сомнения getRawOffset. У меня все еще есть одно сомнение TimeZone currentTimeZone = TimeZone.getTimeZone(EST); Календарь currentDt = новый GregorianCalendar (currentTimeZone, Locale.US); System.out.println(EST при дневном свете +TimeZone.getTimeZone(EST).inDaylightTime(currentDt.getTime()) ); печатает ложь! почему это ? - person Jeevan; 05.04.2013