在解析ISO8601日期时间时我做错了什么?

时间:2014-10-15 14:21:52

标签: java datetime jodatime assert iso8601

我期待下面的测试通过。有人能告诉我这里我做错了什么吗?我很可能使用错误的模式,但我看不出有什么问题。

@Test
public void parseDateTest() {
    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.sss'Z'");
    DateTime dt = formatter.parseDateTime("1983-03-06T05:00:03.000Z");
    assertEquals("1983-03-06T05:00:03.000Z", dt.toString());
}

FYI dt.toString()确实打印:1983-03-06T05:00:00.000Z

谢谢!

P.S。 请注意,在此片段中,我依赖于默认时区。这不是生产代码,如何根据需要正确处理时区,还包括许多其他问题。

默认时区源自系统属性user.timezone。如果该值为null或不是有效标识符,则转换JDK TimeZone缺省值。如果失败,则使用UTC。

2 个答案:

答案 0 :(得分:4)

这会检查"1983-03-06T05:00:03.000Z"是否等于dt.toString()。您说dt.toString()等于"1983-03-06T05:00:00.000Z"

"1983-03-06T05:00:03.000Z" !== "1983-03-06T05:00:00.000Z"

现在问题是为什么dt.toString()没有正确的秒数。我们来看看你的DateTimeFormat模式:

"yyyy-MM-dd'T'HH:mm:ss.sss'Z'"

According to the docss代表“秒分”,S代表“分秒”(注意案例)。这意味着在输入字符串中,03000都被解析为秒(当后者应该是分数)并且DateTime的秒被{{1}覆盖}。尝试更新此格式字符串:

00

答案 1 :(得分:0)

请勿使用dt.toString(),而是使用formatter.format(dt)。这就是格式化器的用途:

@Test
public void parseDateTest() {
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  LocalDateTime dt = formatter.parse("1983-03-06T05:00:03.000Z", LocalDateTime::from);
  assertEquals("1983-03-06T05:00:03.000Z", formatter.format(dt));
}