将日期从字符串解析为日期对象时出现 ParseException
ParseException while parsing date from String to date Object
我在解析从 String
到 Date
对象的日期时得到 ParseException
。日期字符串还包含时区。我正在使用此代码:
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
System.out.print(sdf.parse("2018-01-16T00:07:00.000+05:30"));
以下是我遇到的错误:
Exception in thread "main" java.text.ParseException: Unparseable date: "2018-01-16T00:07:00.000+05:30"
at java.text.DateFormat.parse(DateFormat.java:366)
您使用的是 ISO 8601 日期。
使用 SimpleDateFormat :
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.'SSSX");
System.out.print(sdf.parse("2018-01-16T00:07:00.000+05:30"));
另外,您可以使用 ISO 8601 提供的解析中的构建:
使用 joda 时间 Instant:
Instant.parse("2018-01-16T00:07:00.000+05:30")
JAVA 8 :(首选见下方评论)
System.out.println(java.time.OffsetDateTime.parse(s));
更改以下内容:
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
System.out.print(sdf.parse("2018-01-16 0:07:00 +0530"));
您正在尝试解析代表一般时区的 z,例如 GMT IST 等,但是您需要像 +0530 这样的 Z 时区偏移量,以便 India.Also 删除字符串之间的 OT
。您的日期格式应与模式匹配。
参考 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
您在 SimpleDateFormat
中使用的格式必须与输入 String
匹配。
您的输入是2018-01-16T00:07:00.000+05:30
,即ISO8601 compliant:
- 年月日 (
2018-01-16
)
- 后跟字母
T
- 后跟 hour:minutes:seconds. 毫秒 (
00:07:00.000
)
- 之后是 UTC offset (
+05:30
)
注意:偏移量 +05:30
是 不是 时区。 Read this 了解区别。
无论如何,您使用的模式 ("yyyy-MM-dd HH:mm:ss z"
) 与输入字符串不匹配:
- 它缺少日期和时间之间的
T
- 缺少毫秒
- 偏移前有一个space
- 解析偏移量的正确字母是
X
(尽管我认为 z
可能有效,具体取决于您使用的 JVM 版本;在我的测试中,它没有)
所以你的代码应该是:
// use "XXX" to parse the whole offset (only one "X" will parse just `+05`, missing the `:30` part)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date d = sdf.parse("2018-01-16T00:07:00.000+05:30");
但是使用新的 Java 8 类 更好:
// parse ISO8601 compliant string directly
OffsetDateTime odt = OffsetDateTime.parse("2018-01-16T00:07:00.000+05:30");
如果你还需要使用一个java.util.Date
对象,很容易转换:
// convert to java.util.Date
Date date = Date.from(odt.toInstant());
我在解析从 String
到 Date
对象的日期时得到 ParseException
。日期字符串还包含时区。我正在使用此代码:
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
System.out.print(sdf.parse("2018-01-16T00:07:00.000+05:30"));
以下是我遇到的错误:
Exception in thread "main" java.text.ParseException: Unparseable date: "2018-01-16T00:07:00.000+05:30"
at java.text.DateFormat.parse(DateFormat.java:366)
您使用的是 ISO 8601 日期。
使用 SimpleDateFormat :
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.'SSSX");
System.out.print(sdf.parse("2018-01-16T00:07:00.000+05:30"));
另外,您可以使用 ISO 8601 提供的解析中的构建:
使用 joda 时间 Instant:
Instant.parse("2018-01-16T00:07:00.000+05:30")
JAVA 8 :(首选见下方评论)
System.out.println(java.time.OffsetDateTime.parse(s));
更改以下内容:
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
System.out.print(sdf.parse("2018-01-16 0:07:00 +0530"));
您正在尝试解析代表一般时区的 z,例如 GMT IST 等,但是您需要像 +0530 这样的 Z 时区偏移量,以便 India.Also 删除字符串之间的 OT
。您的日期格式应与模式匹配。
参考 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
您在 SimpleDateFormat
中使用的格式必须与输入 String
匹配。
您的输入是2018-01-16T00:07:00.000+05:30
,即ISO8601 compliant:
- 年月日 (
2018-01-16
) - 后跟字母
T
- 后跟 hour:minutes:seconds. 毫秒 (
00:07:00.000
) - 之后是 UTC offset (
+05:30
)
注意:偏移量 +05:30
是 不是 时区。 Read this 了解区别。
无论如何,您使用的模式 ("yyyy-MM-dd HH:mm:ss z"
) 与输入字符串不匹配:
- 它缺少日期和时间之间的
T
- 缺少毫秒
- 偏移前有一个space
- 解析偏移量的正确字母是
X
(尽管我认为z
可能有效,具体取决于您使用的 JVM 版本;在我的测试中,它没有)
所以你的代码应该是:
// use "XXX" to parse the whole offset (only one "X" will parse just `+05`, missing the `:30` part)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date d = sdf.parse("2018-01-16T00:07:00.000+05:30");
但是使用新的 Java 8 类 更好:
// parse ISO8601 compliant string directly
OffsetDateTime odt = OffsetDateTime.parse("2018-01-16T00:07:00.000+05:30");
如果你还需要使用一个java.util.Date
对象,很容易转换:
// convert to java.util.Date
Date date = Date.from(odt.toInstant());