使用新的java.time.DateTimeFormatter解析日期和时间

时间:2014-11-06 11:52:46

标签: parsing date time java-8

我有这种类型的日期:2004-12-31 23:00:00-08但是我所知道的并且我从文档中使用的模式中没有一个工作正常。我认为它应该像“yyyy-MM-dd HH:mm:ssX”,但它不起作用。

1 个答案:

答案 0 :(得分:2)

对不起,但这是一个已知的错误,已在2014年1月报告。根据bug log,可能的解决方案被推迟。

避免使用其他外部库的简单解决方法是文本预处理。这意味着:在解析文本之前,您只需附加前缀":00"。例如:

String input = "2004-12-31 23:00:00-08";
String zero = ":00";
if (input.charAt(input.length() - 3) == ':') {
  zero = "";
}
ZonedDateTime zdt = 
  ZonedDateTime.parse(
    input + zero, 
    DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ssXXX"));
System.out.println(zdt);
// output: 2004-12-31T23:00-08:00

由于与@Seelenvirtuose争论而更新:

只要您只有几小时但没有分钟部分的偏移,那么模式" uuuu-MM-dd HH:mm:ssX"也会解决你的问题(正如@Seelenvirtuose在他的评论中正确说明的那样)。

但是如果你必须处理各种字符串的列表,其中混合偏移量如" -08"," Z"或" +05:30" (后者是印度标准时间)那么你通常应该应用包含三个XXX的模式。但是这当前失败了(通过在Java-8的最新版本中测试来验证它)。因此,在这种情况下,您仍然需要进行文本预处理和/或文本分析。