我期待下面的测试通过。有人能告诉我这里我做错了什么吗?我很可能使用错误的模式,但我看不出有什么问题。
@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。
答案 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 docs,s
代表“秒分”,S
代表“分秒”(注意案例)。这意味着在输入字符串中,03
和000
都被解析为秒(当后者应该是分数)并且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));
}