解析日期从String到date的ParseException

时间:2018-01-30 09:34:47

标签: java date simpledateformat datetime-parsing parseexception

我在解析从ParseExceptionString对象的日期时收到Date。日期字符串还包含时区。我正在使用此代码:

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)

3 个答案:

答案 0 :(得分:3)

您在<p><a href="http://example.com/?keys%5B%5D=val">..%5B%5D..</a> <p><a href="http://example.com/?keys[]=val">..[]..</a>中使用的格式必须与输入group_concat_max_len匹配。

您的输入为SimpleDateFormat,即ISO8601 compliant

  • 年 - 月 - 日(String
  • 后跟字母2018-01-16T00:07:00.000+05:30
  • 后跟小时:分钟:秒。毫秒(2018-01-16
  • 后跟UTC offsetT

注意:偏移00:07:00.000 不是时区。 Read this了解其中的差异。

无论如何,您使用的模式(+05:30)与输入字符串不匹配:

  • 它错过了日期和时间之间的+05:30
  • 它错过了毫秒
  • 在偏移之前有一个空格
  • 解析偏移的正确字母是"yyyy-MM-dd HH:mm:ss z"(虽然我认为T可能有效,具体取决于您使用的JVM版本;在我的测试中,它没有)

所以你的代码应该是:

X

但是,如果您可以使用新的Java 8类,那么它会更好:

z

如果您仍然需要使用// 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"); 对象,则转换起来很容易:

// parse ISO8601 compliant string directly
OffsetDateTime odt = OffsetDateTime.parse("2018-01-16T00:07:00.000+05:30");

答案 1 :(得分:1)

您使用的是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));

答案 2 :(得分:1)

更改以下内容:

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等,但是对于India,您需要Z区偏移,如+0530。还要删除字符串之间的OT。您的日期格式应与模式匹配。 请参阅https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html