2016-05-27 35 views
1

У меня возникли проблемы преобразующего java.util.Date в java.time.LocalDateTime, и я имею очень странный эффект в отношении временной зоны:Преобразование java.util.Date в java.time.LocalDateTime с помощью ZoneId.systemDefault()

Date date = new Date(-3155677200000L); // 1870-01-01T00:00:00.000+0100 

LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); // 1869-12-31T23:53:28 

Время действительно выключено. 6 минут и 32 секунды, что раздражает, потому что он также меняет дату и даже год здесь.

Это связано с ZoneId.systemDefault(), если я использую ZoneOffset, он работает.

Почему? Это ошибка в JDK? В только кажется, произошло за даты до 1893.

ZoneId.systemDefault() Европа/Берлин (CET, +01: 00)

Аналогично:

ZonedDateTime zonedDateTime = LocalDateTime.of(1870, 1, 1, 0, 0, 0, 0).atZone(ZoneId.systemDefault()); 

принты:

1870-01-01T00:00+00:53:28[Europe/Berlin] 

ожидаемый результат:

1870-01-01T00:00+01:00:00[Europe/Berlin] 

ответ

4

Преобразование правильное в соответствии с правилами IANA. Правило Europe/Berlin начинается с этой строки:

Zone Europe/Berlin 0:53:28 - LMT 1893 Apr 

Вы начали с 1869-12-31T23: 00: 00Z, поэтому местное время 1869-12-31T23: 53: 28.

Никаких ошибок здесь - всего лишь ошибочное ожидание.

+0

Так что фактическое представление java.util.Date не так, как должно быть 1869-12-31T23: 53: 28.000 + 0100? – sco0ter

+1

@ user2907078: Я не знаю, что вы подразумеваете под «представлением java.util.Date не так» - значение «Date» - это только момент времени, который составляет 1869-12-31T23: 00: 00Z, или эквивалентно 1870-01-01T00: 00: 00.000 + 0100. Это значение для значения миллисекунд-с-эпохи -3155677200000L. Если вы спрашиваете, неправильно ли 3155677200000L, мы не знаем - мы не знаем, откуда вы его взяли. –

Смежные вопросы