繁体   English   中英

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

[英]Convert date time string like Joda DateTime(String) with Java 8

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

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

我需要将所有三个都转换为java.time.LocalTimeDate Joda在DateTime对象上有一个不错的构造函数,该结构将所有三种格式都当作Strings进行转换。 DateTime dt = new DateTime(StringFromAPI); 足够。

Java 8( java.time包)中是否有类似的功能? 看来我现在现在首先必须对String进行正则表达式检查格式,然后创建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格式就可以保证质量。 您的三个示例字符串的结果与上面相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM