使用Java 8转换日期时间字符串,如Joda DateTime(String)

时间:2017-04-04 13:36:56

标签: java datetime time jodatime

我有一个API,可以用三种可能的格式返回JSON中的日期值:

  1. 2017-04-30T00:00 + 02:00
  2. 2016-12-05T04:00
  3. 2016年12月5日
  4. 我需要将所有三个转换为java.time.LocalTimeDate。 Joda在DateTime对象上有一个很好的构造函数,它接受所有三种格式作为字符串并转换它们。 DateTime dt = new DateTime(StringFromAPI);就足够了。

    Java 8(java.time包)中是否有类似的功能?我现在首先必须使用String正则表达式来检查格式,然后创建LocalDateTimeZonedDateTimeLocalDate并将后者转换为{{1} }}。对我来说似乎有点麻烦。有一个简单的方法吗?

1 个答案:

答案 0 :(得分:3)

我提出两种选择,每种选择都有其优点和缺点。

一,构建自定义Fixes a bug which blocked ChromeDriver automation extension from loading and thereby causing window resizing/positioning & screenshot functionalities to break. 以接受三种可能的格式:

DateTimeFormatter

一方面,它很干净,另一方面,有人可能很容易发现它有点棘手。对于问题中的三个示例字符串,它会产生:

public static LocalDateTime parse(String dateFromJson) {
    DateTimeFormatter format = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
            .optionalStart()
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .optionalStart()
            .appendOffsetId()
            .optionalEnd()
            .optionalEnd()
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter();
    return LocalDateTime.parse(dateFromJson, format);
}

另一种选择,依次尝试三种不同的格式并选择有效的格式:

2017-04-30T00:00
2016-12-05T04:00
2016-12-05T00:00

我不认为这是最漂亮的代码,有些人可能认为它比第一个选项更直接吗?我认为单纯依靠内置的ISO格式是有品质的。三个示例字符串的结果与上面相同。