在 DateTimeFormatter 中处理多种格式

ric*_*din 5 java date-formatting java-8 dateformatter

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

  • 2019-06-20 12:18:07.207 +0000 世界标准时间
  • 2019-06-20 12:18:07.20 +0000 世界标准时间
  • 2019-06-20 12:18:07.2 +0000 世界标准时间
  • 2019-06-20 12:18:07 +0000 世界标准时间

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

按照SO答案Optional parts in SimpleDateFormat中给出的建议,我尝试使用 type 提供的可选格式DateTimeFormatter,使用字符[]。我尝试了以下模式:

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

然而,它们都不起作用。

有什么建议吗?

Jay*_*ker 8

您可以使用和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);
Run Code Online (Sandbox Code Playgroud)

诀窍在于DateTimeFormatter.ISO_LOCAL_TIME处理用于表示其本身的毫秒数的不同位数。来自DateTimeFormatter.ISO_LOCAL_TIMEJavaDoc:

这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展本地时间格式。格式包括:
[..]
1 到 9 位数字,表示纳秒。将根据需要输出尽可能多的数字。