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(), если анализируемая строка не имеет часового пояса.

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