SimpleDateFormat忽略字符

时间:2015-11-06 21:23:36

标签: java date simpledateformat

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

2 个答案:

答案 0 :(得分:2)

我知道这是旧的,但是对于中间带T的日期以及在“ 2018-08-24T08:02:05-04:00”结尾的时区,请在您的simpledateformat中使用以下内容:“ yyyy- MM-dd \'T \'HH:mm:ssX“

答案 1 :(得分:2)

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

您可能会考虑的另一种方法是“尝试一下”以确定您拥有的格式并根据该格式选择格式器。例如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));

此代码段的输出为:

2015-11-06T21:23:18
2018-08-25T08:18:49

我建议您避免使用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));

输出是相同的,只是现在有偏移量:

2015-11-06T21:23:18Z
2018-08-25T08:18:49Z

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