Когда вы говорите, что у вас есть время в UTC, я предполагаю, что вы держите его в Calendar
(Date
не имеет понятия о часовом поясе, несмотря на вводящее в заблуждение toString()
).Если у вас есть время, например, в String
, вы можете легко проанализировать его или экземпляр календаря, как здесь:
Calendar summer = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);
summer
представляет 9:00 AM UTC 27 июня 2011 года. Теперь все, что вам нужно сделатьизменить часовой пояс с UTC на Мельбунр, Австралия:
summer.setTimeZone(TimeZone.getTimeZone("Australia/Melbourne"));
Я буду использовать FastDateFormat
для правильной печати даты:
final FastDateFormat formatter = FastDateFormat.getDateTimeInstance(FastDateFormat.SHORT, FastDateFormat.SHORT);
System.out.println(formatter.format(summer));
Время в Мельбурне 19: 00 (+10 часов).Но измените дату на зиму:
Calendar winter = new GregorianCalendar(DateUtils.UTC_TIME_ZONE);
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
System.out.println(formatter.format(winter));
И вдруг время в Мельбурне будет 20: 00 (+11 часов).
Разница доказывает, что изменениечасовой пояс на Calendar
принимает во внимание летнее время.В течение июня в часовом поясе UTC в Австралии зима, поэтому они не наблюдают летнее время.
Но зимой в UTC в Австралии лето - и они переходят на летнее время, переводя часы на один час.По этой причине зимой разница составляет +11 часов, а в летнее время UTC +10.
Но подождите!Это становится еще более интересным, если учитывать несколько часовых поясов, наблюдающих летнее время.Сначала я создаю ту же дату в часовом поясе Европы / Осло:
Calendar winter = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
winter.set(2011, Calendar.DECEMBER, 27, 9, 0, 0);
9: 00. В Осло зимой - 8:00 UTC, а в Мельбурне - 19:00 ( + 10 часов ).).
Но в то же время летом:
Calendar summer = new GregorianCalendar(TimeZone.getTimeZone("Europe/Oslo"));
summer.set(2011, Calendar.JUNE, 27, 9, 0, 0);
На самом деле 7:00 UTC и 17:00 в Мельбурне! + 8 часов !
Почему-то люди считают, что разница между двумя часовыми поясами всегда постоянна ( "разница между Осло и Мельбурном составляет всегда 10 часов) - что не верно, особенно когда учитываются разные полушария.
В действительности зимой в Осло (без летнего времени, UTC + 1) ТЛЧ наблюдается в Мельбурне (UTC + 11). С другой стороны, хотя в Осло лето и наблюдается летнее время (UTC + 2), его нет в Мельбурне (UTC + 10).Теперь становится очевидным, почему разница варьируется от 8 до 10 часов в зависимости от дня года.
Также помните, что первый и последний день летнего времени не являются глобальными, а выбираются произвольно для каждого часового пояса. Это означает, чтотакже возможна разница в 9 часов (!) Например, проверьте 1 апреля этого года.