解析 ISO 8601 格式的字符串时出现 SimpleDateFormat 问题

SimpleDateFormat issue when parsing a String in ISO 8601 format

感谢有很多类似的帖子,但我找不到具体的帮助。

我正在尝试将此字符串转换为 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")

有什么想法吗?

传递给您的 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 package (JDK 1.8+) or the back port (JDK 1.6+) 而不是已过时(没有双关语意)Date and/or Calendar 类.

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

我已经给 投了赞成票,正是因为它包含并推荐 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();

A 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充满了可能性。