[英]Convert date time string like Joda DateTime(String) with Java 8
我有一个API,可以使用三种可能的格式返回JSON中的日期值:
我需要将所有三个都转换为java.time.LocalTimeDate
。 Joda在DateTime
对象上有一个不错的构造函数,该结构将所有三种格式都当作Strings进行转换。 DateTime dt = new DateTime(StringFromAPI);
足够。
Java 8( java.time
包)中是否有类似的功能? 看来我现在现在首先必须对String
进行正则表达式检查格式,然后创建LocalDateTime
, ZonedDateTime
或LocalDate
并将后者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.