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

最佳答案

最干净,最清晰的解决方案是,您是否可以将字符串与两个来源分开,并对每个来源使用适当的格式化程序。
您可能会考虑的另一种方法是“尝试一下”以确定您拥有的格式,然后根据该格式选择格式器。例如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));
该代码段的输出为:

我建议您避免使用SimpleDateFormat类。它早已过时,而且非常麻烦。相反,我建议您使用java.time(现代的Java日期和时间API)。使用起来非常好。
方括号表示格式的可选部分。该格式还将接受一个字符串,该字符串的中间有一个空格和一个T,一个没有任何字符串。对于大多数目的,我建议我们可以接受。编辑:您不能使用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));
输出是相同的,只是现在有偏移量:

链接: Oracle tutorial: Date Time解释了如何使用java.time

关于java - SimpleDateFormat忽略字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33575947/

10-11 00:09
查看更多