【问题标题】:SimpleDateFormat issue when parsing a String in ISO 8601 format解析 ISO 8601 格式的字符串时的 SimpleDateFormat 问题
【发布时间】:2017-05-16 13:34:26
【问题描述】:

感谢有很多关于此的类似帖子,但我找不到特定的帮助。

我正在尝试将此字符串转换为 Java 中的日期

2017-05-16 06:24:36-0700

但每次使用此代码都会失败

Date Login = new SimpleDateFormat("dd/MM/yy HH:mm:ss").parse("2017-05-16 06:24:36-0700");

现在我假设它是由于最后的时区信息 - 我只是不知道如何设置格式。我试过了,但没有运气

SimpleDateFormat("dd/MM/yy HH:mm:ssZ")

有什么想法吗?

【问题讨论】:

标签: java date iso8601


【解决方案1】:

传递给SimpleDateFormat 的日期格式为"dd/MM/yy",而您尝试解析的日期格式为"yyyy-MM-dd"。试试这个:

Date login = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ").parse("2017-05-16 06:24:36-0700");

附带说明一下,根据您使用的 Java 版本,我建议使用新的 java.time 包 (JDK 1.8+) 或该包的 back port (JDK 1.6+) 而不是过时的(没有双关语)Date 和/或Calendar 类。

Instant login = Instant.from(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssZ").parse("2017-05-16 06:24:36-0700"));

【讨论】:

  • 是的,你是对的,我以错误的格式传递了日期。菜鸟错误...感谢指点
  • 在java.time中,更简单的把中间的SPACE替换成T符合ISO 8601,然后直接解析:OffsetDateTime.parse( "2017-05-16 06:24:36-0700".replace( " " , "T" ) )
  • @BasilBourque,我无法让它在 Java 8 中工作(无法在索引 19 处解析文本“2017-05-16T06:24:36-0700”)。它需要在偏移量中有一个冒号,-07:00。不过,我想你曾经告诉过我们它可以在 Java 9 中运行。
  • @OleV.V.是的,我现在记得,无法解析缺少冒号的偏移量是 Java 8 中的一个错误,在 Java 9 中已修复。请参阅code run live at IdeOne.com
【解决方案2】:

我已经投票支持Bryan’s answer,因为它包含并推荐了java.time 解决方案。不过,我需要补充一些想法。

您的代码 reviloSlater 丢弃了时区信息(更准确地说,是时区偏移信息),我不确定我从一开始就敢这样做。使用 java.time 类时,包含它会更自然,并且在以后确定不需要它时很容易丢弃。

用偏移量解析:

    OffsetDateTime loginOdt = OffsetDateTime.parse("2017-05-16 06:24:36-0700",
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssZ"));

删除时区偏移信息

    LocalDateTime loginLdt = loginOdt.toLocalDateTime();

LocalDateTime 是没有任何时区或偏移信息的日期和时间。在这种情况下,我们当然得到

2017-05-16T06:24:36

Bryan 的 java.time 代码也使用字符串中的时区偏移信息。编辑:在 Bryan 的编辑之后,代码现在可以运行并为我们提供:

2017-05-16T13:24:36Z

这是同一时间点(Instant.toString() 以 UTC 打印时间)。另一种方法是,使用之前的OffsetDateTime 就可以了

    Instant login = loginOdt.toInstant();

java.time 充满了可能性。

猜你喜欢
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多