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

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

  1. 2017-04-30T00:00 + 02:00
  2. 2016-12-05T04:00
  3. 2016年12月5日

我需要将所有三个转换为java.time.LocalTimeDate 。 Joda在DateTime对象上有一个很好的构造函数,它接受所有三种格式作为字符串并转换它们。 DateTime dt = new DateTime(StringFromAPI); 足够。

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

我提出两个选项,每个选项都有其优点和缺点。

一,构建自定义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 

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

 public static LocalDateTime parse(String dateFromJson) { try { return LocalDateTime.parse(dateFromJson); } catch (DateTimeParseException e) { // ignore, try next format } try { return LocalDateTime.parse(dateFromJson, DateTimeFormatter.ISO_OFFSET_DATE_TIME); } catch (DateTimeParseException e) { // ignore, try next format } return LocalDate.parse(dateFromJson).atStartOfDay(); } 

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