Преобразование 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] тому, что вы наблюдаете.