Преобразование LocalDateTime года 2CE из одного дня при преобразовании в java.util.Date

У меня есть дата, представленная строкой "0002-01-04T00: 49: 40.000", т.е. дата в году 2CE. Мне нужно преобразовать его в экземплярjava.util.Date комбинируя его с идентификатором часового пояса "Etc/UTC". Следующий код показывает, как я это делаю:

public static Date toDate(LocalDateTime localDateTime, String timezoneId){
    if(localDateTime == null) return null;
    if(timezoneId != null) {
        localDateTime.toDateTime(DateTimeZone.forID(timezoneId)).toDate();
    } else {
        return localDateTime.toDateTime().toDate()
    }
}

Но LocalDateTime.toDate() не работает правильно. Это добавляет +1 день к дате.

"0002-01-04T00: 49: 40.000Z" ---> "Чт Янв 05 16:49:40 PST 2".

1 ответ

Как указано в моем комментарии, ошибки нет. Все правильно, хотя вы не ожидали результата, который вы наблюдали. Поэтому я объясню это подробно. Пример кода на основе вашего вспомогательного метода:

System.out.println(
    toDate(org.joda.time.LocalDateTime.parse("0002-01-04T00:49:40.000"), "GMT")
); // Fri Jan 06 01:49:40 CET 2

Вывод основан на методе java.util.Date.toString(), Запутанная вещь об этом методе:

  • Используется системный часовой пояс (в моем случае GMT ​​+ 01: 00). Следовательно, эта деталь объясняет, почему - в моем случае - время на один час вперед (а в вашем случае на 8 часов позже UTC из-за вашей PST зоны). Если мы рассмотрим только время, то ожидаем, что в тот же день в качестве датыGMT+01 и днем ​​раньше для PST...

  • Менее известный, но очень важный: выводjava.util.Date.toString()использует смешанный календарь с григорианским переключением на 1582-10-15. До этой даты используется юлианский календарь. И вы используете год 0002! Итак, здесь мы сравним часть джал-тайма с пролептической григорианской датой с датой юлианского календаря. Для года 0002 разница между двумя календарями составляет два дня из-за разных правил високосного года.Юлианский календарь на два дня вперед в году 0002. Как понять эти два дня? Годы 100, 200, 300, 500, 600, 700, 900, 1000, 1100, 1300, 1400 и 1500 не являются високосными годами в григорианском календаре, в то время как високосные годы в юлианском календаре => 12 дней. Но папа Грегор удалил 10 дней в 1582 году (на следующий день после 1582-10-04 было 1582-10-15). Следовательно: 12 - 10 = 2 дня дельты за годы до 100 г. н.э. и после 99 г. до н.э.

  • Суммирование: [0002-01-04] минус один день (коррекция времени для PST) плюс два дня (календарная коррекция) приводят к [0002-01-05] тому, что вы наблюдаете.

Другие вопросы по тегам