在 DateTimeFormatter 中处理多种格式

我正在使用 Java 8 开发一个函数,该函数必须处理从以下日期String到的转换:LocalDateTime

  • 2019-06-20 12:18:07.207 +0000 UTC

  • 2019-06-20 12:18:07.20 +0000 UTC

  • 2019-06-20 12:18:07.2 +0000 UTC

  • 2019-06-20 12:18:07 +0000 UTC

这些字符串是从我无法更改的外部库生成的。

我尝试使用 type 提供的可选格式DateTimeFormatter,使用字符[and ]。我尝试了以下模式:

  • yyyy-MM-dd HH:mm:ss[.S[S[S]]] Z z

  • yyyy-MM-dd HH:mm:ss[.S[S][S]] Z z

但是,它们都不起作用。

有什么建议吗?


神不在的星期二
浏览 294回答 3
3回答

翻过高山走不出你

您可以使用和DateTimeFormatterBuilder重用常量来构建模式:ISO_LOCAL_DATEISO_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_TIMEJavaDoc:这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展本地时间格式。格式包括:[..]纳秒级的一到九位数字。将根据需要输出尽可能多的数字。

慕码人2483693

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();此代码未经测试,但每次都尝试在开始/结束可选块中构建您的可选模式。

郎朗坤

这是我在一个采用不同格式的应用程序中使用的示例,您可以看到毫秒是可选的,最后也是“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()       .toFormatterappendPattern 是静态值,其他在内部可选的开始和结束,构建这样的模式非常简单(如果你当然知道如何去做;))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java