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

lkaoscv7  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(238)

我希望通过下面的测试。有人能告诉我哪里做错了吗?很可能我使用了错误的模式,但我看不到哪里出了问题。

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

仅供参考日期toString()打印:1983年3月6日星期一05时00分00秒
谢谢!
请注意,在这个代码片段中,我依赖于默认时区。这不是生产代码,如何根据需要正确处理时区是许多其他问题所涵盖的。

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

j2qf4p5b1#

这个函数检查"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'"

根据文档,s表示“秒”,S表示“秒的分数”(注意大小写)。这意味着在您的输入字符串中,03000都被解析为秒(后者应该是分数),而您的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());
}
j5fpnvbx

j5fpnvbx2#

Java.时间

下面引用的是home page of Joda-Time的通知:
请注意,从JavaSE8开始,要求用户迁移到java.time(JSR-310)-JDK的核心部分,它将取代这个项目。

    • 使用java.time API的解决方案**:java.time API基于ISO 8601,因此您不需要DateTimeFormatter来解析已经采用ISO 8601格式的日期-时间字符串(例如,您的日期-时间字符串1983-03-06T05:00:03.000Z)。
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;

class Main {
    public static void main(String[] args) {
        String strModifiedDate = "1983-03-06T05:00:03.000Z";
        Instant instant = Instant.parse(strModifiedDate);
        System.out.println(instant);

        // It can also be directly parsed into a ZonedDateTime
        ZonedDateTime zdt = ZonedDateTime.parse(strModifiedDate);
        System.out.println(zdt);

        // or even into an OffsetDateTime
        OffsetDateTime odt = OffsetDateTime.parse(strModifiedDate);
        System.out.println(odt);
    }
}
    • 输出**:
1983-03-06T05:00:03Z
1983-03-06T05:00:03Z
1983-03-06T05:00:03Z

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

62lalag4

62lalag43#

不要使用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));
}

相关问题