解析 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
充满了可能性。
感谢有很多类似的帖子,但我找不到具体的帮助。
我正在尝试将此字符串转换为 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
充满了可能性。