Я наблюдал странное поведение java.util.GregorianCalendar, и мне интересно, почему он так себя ведет.
Я хотел получить время в UTC, что в тот же момент, что и 26.10.2014 01:00 CET
, а затем получить UTC полночь за тот же день. Поэтому сначала я установил фактическую дату CET, чем изменил часовой пояс на UTC и, наконец, установил HOUR_OF_DAY равным 0.
Пример:
- 26.10.2014 01:00 CET совпадает с 25.10.2014 23:00 UTC
- полночь (25.10.2014 23:00 UTC) должна быть 25.10.2014 00:00 UTC
см. код юнита ниже:
@Test
public void testWeird() {
GregorianCalendar date = (GregorianCalendar) GregorianCalendar.getInstance(TimeZone.getTimeZone("CET"));
date.set(2014, 9, 26, 1, 0, 0); //26.10.2014
System.out.println(date.getTime().toGMTString() + " " + date.getTimeInMillis()); // 25 Oct 2014 23:00:00 GMT 1414278000764 (OK)
date.setTimeZone(TimeZone.getTimeZone("UTC"));
//date.get(Calendar.YEAR); // uncomment this line to get different results
System.out.println(date.getTime().toGMTString() + " " + date.getTimeInMillis()); // 25 Oct 2014 23:00:00 GMT 1414278000764 (OK)
date.set(Calendar.HOUR_OF_DAY, 0);
System.out.println(date.getTime().toGMTString() + " " + date.getTimeInMillis()); // 26 Oct 2014 00:00:00 GMT 1414281600764 (NOT OK! why not 25 Oct 2014 00:00:00 GMT 1414195200218 ?)
}
Я ожидал, что установка часа = 0 на 25.10.2014 23:00 GMT
даст мне 25.10.2014 00:00 GMT
, но она изменилась на 26.10.2014 00:00 GMT
.
Однако, если я раскомментирую строку date.get(Calendar.YEAR);
, дата, кажется, правильно рассчитана.
То же самое происходит и с jdk.1.7.0_10 и jrockit-jdk1.6.0_37.