为了账号安全,请及时绑定邮箱和手机立即绑定

在 DateTimeFormatter 中处理多种格式

在 DateTimeFormatter 中处理多种格式

神不在的星期二 2023-06-14 15:39:58
我正在使用 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_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 扩展本地时间格式。格式包括:
[..]
纳秒级的一到九位数字。将根据需要输出尽可能多的数字。


查看完整回答
反对 回复 2023-06-14
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

DateTimeFormatterBuilder我认为为此目的使用 a 更好。对于可选部分,只需使用以下方法之一:

  1. 可选开始()和可选结束()

  2. 使用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();

此代码未经测试,但每次都尝试在开始/结束可选块中构建您的可选模式。


查看完整回答
反对 回复 2023-06-14
?
郎朗坤

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 是静态值,其他在内部可选的开始和结束,构建这样的模式非常简单(如果你当然知道如何去做;))


查看完整回答
反对 回复 2023-06-14
  • 3 回答
  • 0 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信