2

我已经尝试了几乎所有关于这个片段的方法,但我仍然得到 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.getDateTimeMillis (AssembledChronology.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)

4

1 回答 1

2

似乎输入不是有效日期。该问题已在此页面中讨论过。

原因:

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

有效日期时间的相同原则适用于夏令时 (DST)。在许多地方使用 DST,当地时钟在春季向前移动一小时,在秋季/秋季向后移动一小时。这意味着在春天,有一个本地时间不存在的“间隙”。

错误“Illegal instant due to time zone offset transition”指的是这个间隙。这意味着您的应用程序试图在间隙内创建一个日期时间 - 一个不存在的时间。由于 Joda-Time 对象必须有效,因此这是不允许的。

可能的解决方案如下:

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

  • 将 LocalDate 转换为 DateTime 时,请使用 toDateTimeAsStartOfDay() 来处理和管理任何间隙。

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

于 2018-10-02T13:49:09.907 回答