SimpleDateFormat忽略字符

Bry*_*yan 7 java date simpledateformat

我正在使用a SimpleDateFormat,我从两个不同的来源获得结果.一个源使用该格式"yyyy-MM-dd HH:mm:ss",而另一个使用"yyyy-MM-ddTHH:mm:ssZ".我对从第二种格式获取时区('Z'值)不感兴趣,有没有一种方法可以获得这些时间而不使用不同的格式字符串?有些东西会忽略中间字符以及之后的字符'ss'.

Ole*_*.V. 5

最干净和最清晰的解决方案是,如果您可以将字符串与两个来源分开,并为每个来源使用适当的格式化程序。

您可能会考虑的另一种方法是“试一试”以确定您拥有哪种格式,并根据此选择格式化程序。例如if (result.contains("T") && results.endsWith("Z"))

由于您询问避免使用不同的格式字符串,这也是可能的:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd[ ]['T']HH:mm:ss[X]");

    System.out.println(LocalDateTime.parse("2015-11-06 21:23:18", formatter));
    System.out.println(LocalDateTime.parse("2018-08-25T08:18:49Z", formatter));
Run Code Online (Sandbox Code Playgroud)

这个片段的输出是:

2015-11-06T21:23:18
2018-08-25T08:18:49
Run Code Online (Sandbox Code Playgroud)

我建议你避免SimpleDateFormat上课。它早已过时且出了名的麻烦。相反,我建议您使用 java.time,现代 Java 日期和时间 API。和它一起工作要好得多。

方括号表示格式的可选部分。该格式还将接受一个T中间有空格和 a 的字符串,以及一个没有空格和 a 的字符串。对于大多数目的,我建议我们可以接受。编辑:您不能用 玩类似的技巧SimpleDateFormat,它不接受方括号或任何其他可选部分的语法。

我不高兴忽略第二个字符串中的偏移量并且这样做只是因为你说你想要。我显然更喜欢以下稍微长一点的解决方案:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd[ ]['T']HH:mm:ss[X]")
            .withZone(ZoneOffset.UTC);

    System.out.println(OffsetDateTime.parse("2015-11-06 21:23:18", formatter));
    System.out.println(OffsetDateTime.parse("2018-08-25T08:18:49Z", formatter));
Run Code Online (Sandbox Code Playgroud)

输出是一样的,只是现在有偏移:

2015-11-06T21:23:18Z
2018-08-25T08:18:49Z
Run Code Online (Sandbox Code Playgroud)

链接: Oracle 教程:解释如何使用java.time.


小智 3

我知道这是旧的,但对于中间带有 T 且末尾时区为“2018-08-24T08:02:05-04:00”的日期,请在简单日期格式中使用以下内容:“yyyy-MM-dd \'T\'HH:mm:ssX"