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