Я работаю над кодом, учитывающим разницу в часовых поясах (в данном случае — преобразование даты из UTC в EST/EDT), и заметил, что получаю неверное поле DATE
из переменной Calendar
.
Вот выдержки из журнала смены часового пояса:
UTC time: Fri Nov 15 00:28:44 EST 2013
America/New_York time: Thu Nov 14 19:28:44 EST 2013
Код правильно обновляет время до 14-го, основываясь на том, что отображается с Calendar.getTime()
, но когда я вызываю Calendar.get(Calendar.DATE)
, я все еще получаю 15 в качестве даты.
Почему поля не обновляются, когда само время?
Выдержка из кода:
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
TimeZone fromTz = TimeZone.getTimeZone("UTC");
TimeZone toTz = TimeZone.getTimeZone("America/New_York");
jlog.info(fromTz.getID() + " time: " + cal.getTime().toString());
cal.setTimeZone(fromTz);
// Finds the difference between the two timezones based on their offset from UTC (in the case of the system timezone changing in the future).
long currentTime = System.currentTimeMillis();
int timeDifference = toTz.getOffset(currentTime) - fromTz.getOffset(currentTime);
cal.add(Calendar.MILLISECOND, timeDifference);
if (dst) { // Logic for determining whether or not the extra hour for DST is needed.
cal.add(Calendar.MILLISECOND, fromTz.getDSTSavings());
}
jlog.info(toTz.getID() + " time: " + cal.getTime().toString());
jlog.info(cal.getTime().toString() + " - " + cal.get(Calendar.DATE));
Вывод приведенного выше кода:
UTC time: Fri Nov 15 00:28:44 EST 2013
America/New_York time: Thu Nov 14 19:28:44 EST 2013
Thu Nov 14 19:28:44 EST 2013 - 15
ПРИМЕЧАНИЕ. Пожалуйста, не предлагайте мне использовать Joda-time. Я просто ищу ответ на этот вопрос как есть.
Если это не разрешимо, потому что Calendar/Date - ужасные пакеты, это нормально - я просто сам проанализирую дату, чтобы получить правильные значения. Заранее спасибо.
TimeZone
в UTC, чтобы посмотреть, как он будет выглядеть, когда он будет развернут в среде по времени UTC. Вот почему в выходных данныхDate.toString()
указано EST, но преобразование все равно происходит. Я обновлю вопрос с дополнительной информацией. 12.05.2014DateFormat
позаботится о часовых поясах сам по себе, иначе я бы просто использовал это. Но я попробовал, и это работает, так что я уберу текущий код. Спасибо за вашу помощь. Мне все еще интересно, почемуCalendar.getTime()
иCalendar.get(Calendar.DATE)
конфликтуют, но это не имеет значения, когдаDateFormat.format()
работает так хорошо. 12.05.2014Calendar.get(Calendar.DATE())
использует часовой пояс календаря, тогда какCalendar.getTime()
возвращает момент времени, который затем форматируется с учетом вашего местного часового пояса. Вот и все. Вы не должны абсолютно использовать свой текущий код, настраивая часовой пояс вручную. Вы в основном меняете базовый момент времени. 12.05.2014