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月21日00:00:00.000(美国/圣保罗)键盘箭头向上 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.getDateTimeMillis (Assembly Chronology.Java:133)org.joda.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)


解决方案

似乎输入的日期无效。此page中已讨论了该问题。

原因:

Joda-Time只允许键类存储有效的日期时间。为 例如,2月31日不是有效日期,因此无法存储 (部分除外)。

同样的有效日期-时间原则也适用于夏令时 时间(DST)。在许多地方使用DST,在那里本地时钟移动 春天向前走一小时,秋天向后走一小时。这 意味着在春天,有一个当地时间不存在的"缺口" 存在。

错误"因时区偏移转换而导致的即时非法"是指 到了这个缺口。这意味着您的应用程序试图创建 差距内的Date-Time-不存在的时间。自Joda-Time以来 对象必须有效,这是不允许的。

可能的解决方案如下:

  • 使用LocalDateTime,因为所有本地日期时间都有效。

  • 将LocalDate转换为DateTime时,请使用toDateTimeAsStartOfDay(),因为这会处理和管理任何间隔。

    /li>
  • 分析时,如果要分析的字符串没有时区,请使用parseLocalDateTime()。

相关文章