Jodatime IllegalInstantException
Я попробовал почти все об этом фрагменте, и я все еще получаю IllegalInstentException.
public int getDateDay() {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dt;
try {
dt = formatter.parseDateTime(date);
} catch (IllegalInstantException e) {
dt = formatter.parseLocalDateTime(date).toDateTime();
}
return dt.getDayOfMonth();
}
Неустранимое исключение: org.joda.time.IllegalInstantException Недопустимый момент из-за перехода смещения часового пояса (переход на летнее время "разрыв"): 2018-10-21T00:00:00.000 (America/Sao_Paulo) keyboard_arrow_up arrow_right org.joda.time.chrono.ZonedChronology.localToUTC (ZonedChronology.java:157) org.joda.time.chrono.ZonedChronology.getDateTimeMillis (ZonedChronology.java:122) org.joda.time.chrono.AssembledChronology.getDateTimedhlg1 (1) or1g1.time.base.BaseDateTime. (BaseDateTime.java:257) org.joda.time.DateTime. (DateTime.java:532) org.joda.time.LocalDateTime.toDateTime (LocalDateTime.java:750) org.joda.time.LocalDateTime.toDateTime (LocalDateTime.java:731)
1 ответ
Кажется, ввод не является действительной датой. Проблема обсуждалась на этой странице.
Причина:
Joda-Time позволяет только ключевым классам хранить действительные даты и время. Например, 31 февраля не является допустимой датой, поэтому ее нельзя сохранить (кроме как в частичной).
Тот же принцип действительного времени и даты применяется к летнему времени (DST). Во многих местах используется летнее время, когда местные часы перемещаются вперед на час весной и обратно на час осенью / осенью. Это означает, что весной существует "разрыв", когда местное время не существует.
Ошибка "Недопустимый момент из-за перехода смещения часового пояса" относится к этому разрыву. Это означает, что ваше приложение пыталось создать дату-время в промежутке - время, которого не было. Поскольку объекты Joda-Time должны быть действительными, это недопустимо.
Возможные решения могут быть следующими:
Используйте LocalDateTime, так как все локальные даты и времени действительны.
При преобразовании LocalDate в DateTime, затем используйте toDateTimeAsStartOfDay(), поскольку это обрабатывает и управляет любыми пропусками.
При разборе используйте parseLocalDateTime(), если анализируемая строка не имеет часового пояса.