将日期从字符串解析为日期对象时出现 ParseException

ParseException while parsing date from String to date Object

我在解析从 StringDate 对象的日期时得到 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 :(首选见下方评论)

https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html#parse-java.lang.CharSequence-

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