Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析ISO8601日期时间时我做错了什么?_Java_Datetime_Jodatime_Assert_Iso8601 - Fatal编程技术网

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

Java 解析ISO8601日期时间时我做错了什么?,java,datetime,jodatime,assert,iso8601,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"

我希望下面的考试能通过。有人能告诉我我做错了什么吗?很可能我使用了一个错误的模式,但我看不出什么是错误的

@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

谢谢

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

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

检查1983-03-06T05:00:03.000Z是否等于dt.toString。你说dt.toString等于1983-03-06T05:00:00.000Z

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

,s表示分钟的秒数,s表示第二个音符的分数。这意味着在输入字符串中,03和000都被解析为秒,而后面的应该是分数,DateTime的秒被00覆盖。尝试更新此格式字符串:

@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());
}
不要使用dt.toString,而是使用formatter.formatt。这就是格式化程序的用途:

@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));
}

我假设1983-03-06T05:00:03.000Z应该等于ds.String这一事实在上下文中是清楚的,但感谢您的澄清。无论如何,你的答案是正确的@克里斯蒂安斯蒂我以为你知道,但不完全确定,所以我认为这会有帮助。很高兴SSS解决了这个问题:谢谢,但我想这对Java8有用吗?是的,我本可以将格式化程序传递给toString方法dt.toString formatter,但这毕竟是Joda.toString的默认行为。无论如何,你让我注意到,我没有指定我使用的是Joda,我会更新这个问题。我看到了Joda,但为时已晚,假设功能与Java 8相同,我还是发布了答案。有趣的是,Java8中LocalDateTime dt.toString的默认行为是1983-03-06T05:00:03。我也不知道这个区别。为了澄清,toString实现使用的默认格式是标准格式:yyyy-MM-ddTHH:MM:ss.SSSZZ-per。因此,此答案不正确或具有误导性,因为在这种情况下,没有理由麻烦使用格式化程序。仅供参考,我在此代码段中使用了Joda DateTime。与其将其他信息作为注释发布,不如编辑此问题。如果使用web浏览器,请查找问题下方左下角的编辑链接。顺便说一下,不需要格式化程序。DateTime上toString方法的默认格式是本问题中尝试的标准格式:yyyy-MM-ddTHH:MM:ss.SSSZZ。将字符串传递给DateTime的构造函数:new DateTime 1983-03-06T05:00:03.000Z。我还将传递一个需要分配的时区,而不是隐式地依赖JVM当前的默认时区:new DateTime 1983-03-06T05:00:03.000Z,DateTimeZone.forID Europe/London。谢谢@BasilBourque。剪下的只是用来解释我的问题的一个例子。真正的上下文更复杂,确实需要显式格式化程序。为什么你说我依赖JVM时区?我用的是Z,这对我来说很好。请参阅此页,您正在以评论的形式发布其他信息,而不是编辑您的问题。如果你的问题是关于特定格式的,请在问题中说明!b你的代码中没有关于正则表达式的内容,所以你的第一句话令人困惑。c使用Joda Time解析字符串的主题已经包含在数百个答案中。请在邮寄前搜索。这些答案已经解释了DateTime知道自己分配的时区,如果未指定,则分配JVM的当前默认时区。末端的Z是偏移量,时区比偏移量大得多。
@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());
}
@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));
}