使用Java 8 DateTimeFormatter解析ZonedDateTime

时间:2018-02-12 10:49:48

标签: java java-8

我正在尝试使用以下模式"dd-mm-yyyy'T'HH:mmZ"创建带有DateTimeFormatter的ZonedDateTime:

public static ZonedDateTime timeFromDayMonthYearHHmmTZ(String dateTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy'T'HH:mmZ");
        return ZonedDateTime.parse(dateTime, formatter);
    }

使用前面的代码,以下表达式正确解析:

ZonedDateTime dateTime1 = ZonedDateTimeUtils.dateTimeFromDayMonthYearHHmmTZ("25-01-2018T15:30-0100");

但是,下一个表达式会生成一个异常(请注意TZ偏移中的:):

ZonedDateTime dateTime2 = ZonedDateTimeUtils.dateTimeFromDayMonthYearHHmmTZ("25-01-2018T15:30-01:00");

我的理解是,Z模式中的"dd-mm-yyyy'T'HH:mmZ"应涵盖这两种情况?但是我得到以下例外:

java.time.format.DateTimeParseException: Text '25-01-2018T15:30-01:00' could not be parsed at index 16

理想情况下,我希望有一个灵活的解决方案,我可以解析这两种模式。

2 个答案:

答案 0 :(得分:6)

从我发现的情况来看,Z似乎确实存在问题。

我找到了this question,在答案中,它使用XXX作为偏移量。我尝试了它,它正在工作。我查看了一些变体,例如XXXZZZZZZ,但只有XXX工作正常。

完整模式为dd-MM-yyyy'T'HH:mmXXX

答案 1 :(得分:0)

要解决此错误,您需要使用X代替Z,因此...... "dd-MM-yyyy'T'HH:mmX"

如果您查看java docs,就会解释:

  • Z允许-0800
  • X允许三个-08; -0800; -08:00
  • 中的一个

因此,对于您的案例25-01-2018T15:30-01:00,您需要使用后者。