我正在使用 Java 8 开发一个函数,该函数必须处理从以下日期String到的转换:LocalDateTime2019-06-20 12:18:07.207 +0000 UTC2019-06-20 12:18:07.20 +0000 UTC2019-06-20 12:18:07.2 +0000 UTC2019-06-20 12:18:07 +0000 UTC这些字符串是从我无法更改的外部库生成的。我尝试使用 type 提供的可选格式DateTimeFormatter,使用字符[and ]。我尝试了以下模式:yyyy-MM-dd HH:mm:ss[.S[S[S]]] Z zyyyy-MM-dd HH:mm:ss[.S[S][S]] Z z但是,它们都不起作用。有什么建议吗?
3 回答
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
您可以使用和DateTimeFormatterBuilder
重用常量来构建模式:ISO_LOCAL_DATE
ISO_LOCAL_TIME
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .append(DateTimeFormatter.ISO_LOCAL_DATE) .appendLiteral(" ") .append(DateTimeFormatter.ISO_LOCAL_TIME) .appendPattern("[ Z z]") .toFormatter(); ZonedDateTime dt = ZonedDateTime.parse(date, formatter);
诀窍是DateTimeFormatter.ISO_LOCAL_TIME
处理不同数量的数字来表示它自己的毫秒数。来自DateTimeFormatter.ISO_LOCAL_TIME
JavaDoc:
这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展本地时间格式。格式包括:
[..]
纳秒级的一到九位数字。将根据需要输出尽可能多的数字。
慕码人2483693
TA贡献1860条经验 获得超9个赞
DateTimeFormatterBuilder
我认为为此目的使用 a 更好。对于可选部分,只需使用以下方法之一:
可选开始()和可选结束()
使用appendOptional()附加整个可选模式
这是一个例子:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("" + "[yyyy-MM-dd HH:mm:ss.SSS Z z]" + "[yyyy-MM-dd HH:mm:ss.SS Z z]" + "[yyyy-MM-dd HH:mm:ss.S Z z]" + "[yyyy-MM-dd HH:mm:ss Z z]");
此外,您可以为每个可选的创建一个 dtf 并将它们附加到 appendOptional() 和DateTimeFormatterBuilder
例如 :
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendValue(HOUR_OF_DAY,2) .optionalStart() .appendValue(MINUTE_OF_HOUR,2) .optionalEnd() .optionalStart() .appendValue(SECOND_OF_MINUTE,2) .optionalEnd() .toFormatter();
此代码未经测试,但每次都尝试在开始/结束可选块中构建您的可选模式。
郎朗坤
TA贡献1921条经验 获得超9个赞
这是我在一个采用不同格式的应用程序中使用的示例,您可以看到毫秒是可选的,最后也是“Z”。
new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd'T'HH:mm:ss") .optionalStart() .appendLiteral('.') .appendValue(ChronoField.MILLI_OF_SECOND, 1, 3, SignStyle.NORMAL) .optionalEnd() .optionalStart() .appendLiteral('Z') .optionalEnd() .toFormatter
appendPattern 是静态值,其他在内部可选的开始和结束,构建这样的模式非常简单(如果你当然知道如何去做;))
添加回答
举报
0/150
提交
取消