Нечетные результаты в Joda DateTime на 04.01.1893

Моим часовым поясом является CET (Берлин).
И при тестировании DateTime Joda я заметил некоторые странные вещи:

new DateTime(1893, 4, 1, 0, 0, 0, 0);
=>  java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate();
=>  Fri Mar 31 00:06:32 CET 1893

6-минутные 32 секунды переключают на нижний регистр часовой пояс, заканчивающийся в несуществующее время??
Я должен сказать, что это очень неожиданно, так как я не указывал информации о часовом поясе и таким образом не ожидал сталкиваться с этим видом проблемы.
Если в марте 1893 CET (Берлин) не существует - почему не делает new DateTime(1893, 3, 31, 0, 0, 0, 0) выберите часовой пояс, который соответствует времени, которое я указал (т.е. 0 минут и 0 секунд)?

Что мои опции состоят в том, чтобы получить корректное время с DateTime?

- РЕДАКТИРОВАНИЕ-
Проблема, кажется, toDate (). Я вырезал его прежде, чем отправить вопрос.
Сам Joda на самом деле хорошо работает:

new DateTime(1893, 3, 31, 0, 0, 0, 0);
=>  1893-01-01T00:00:00.000+00:53:28

Это просто, что преобразование в дату перемещает часть смещения в минуты и секунды.

5
задан Stroboskop 11 March 2010 в 16:42
поделиться

2 ответа

Если вы не укажете часовой пояс, к сожалению, Joda Time использует системный. И да, Берлин действительно действительно изменил в то время (и на 6 минут 32 секунды). Итак, вы указали местное время, которого не существовало.

Что вы имеете в виду, говоря «почему [...] не выбирает часовой пояс, который соответствует времени, которое я указал?» - часовой пояс влияет на то, как местное время сопоставляется с UTC. В часовом поясе, который вы неявно указали (позволив ему выбрать вашу систему по умолчанию), время не существует; нет мгновенного отображения UTC на это местное время. Существует любое количество часовых поясов, которые отображают это местное время - как Джода узнает, какой из них выбрать?

Я согласен с тем, что использование часового пояса по умолчанию в системе - плохой ход со стороны Джоды (и один мы исправили в Noda Time ), но все остальное поведение абсолютно нормально. (В Noda Time есть особое исключение именно для этой ситуации, чтобы отличить его от передачи значений, которые более явно плохи, но мы идем.)

Если вы не хотите, чтобы в него входили часовые пояса вообще , то вместо этого следует использовать LocalDateTime .

10
ответ дан 13 December 2019 в 22:06
поделиться

Вы пытались создать экземпляр элемента с помощью new DateTime (1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC); ?

0
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: