Java 将日期从字符串解析为日期对象时发生ParseException

Java 将日期从字符串解析为日期对象时发生ParseException,java,date,simpledateformat,datetime-parsing,parseexception,Java,Date,Simpledateformat,Datetime Parsing,Parseexception,当解析从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

当解析从
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日期

使用SimpleDataFormat:

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"));
在本机上,您可以使用提供的内置解析:

使用joda时间

Java8:(最好参见下面的评论)


您正在使用ISO 8601日期

使用SimpleDataFormat:

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"));
在本机上,您可以使用提供的内置解析:

使用joda时间

Java8:(最好参见下面的评论)

更改以下内容:

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等,但您需要z区偏移量,如印度的+0530。同时删除字符串之间的
OT
。您的日期格式应与模式匹配。 请参阅更改以下内容:

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等,但您需要z区偏移量,如印度的+0530。同时删除字符串之间的
OT
。您的日期格式应与模式匹配。
请参阅在
SimpleDataFormat
中使用的格式必须与输入的
字符串相匹配

您的输入是
2018-01-16T00:07:00.000+05:30
,即:

  • 年月日(
    2018-01-16
  • 后跟字母
    T
  • 后跟小时:分钟:秒。毫秒(
    00:07:00.000
  • 然后是(
    +05:30
注:偏移量
+05:30
不是时区。我想知道两者的区别

无论如何,您使用的模式(
“yyyy-MM-dd HH:MM:ss z”
)与输入字符串不匹配:

  • 它缺少日期和时间之间的
    T
  • 它错过了毫秒
  • 偏移量前有一个空格
  • 解析偏移量的正确字母是
    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());

SimpleDataFormat
中使用的格式必须与输入的
字符串相匹配

您的输入是
2018-01-16T00:07:00.000+05:30
,即:

  • 年月日(
    2018-01-16
  • 后跟字母
    T
  • 后跟小时:分钟:秒。毫秒(
    00:07:00.000
  • 然后是(
    +05:30
注:偏移量
+05:30
不是时区。我想知道两者的区别

无论如何,您使用的模式(
“yyyy-MM-dd HH:MM:ss z”
)与输入字符串不匹配:

  • 它缺少日期和时间之间的
    T
  • 它错过了毫秒
  • 偏移量前有一个空格
  • 解析偏移量的正确字母是
    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());


在日期字符串之间存在的TO呢???你也需要迎合它。嗯。。。解析的字符串是否遵循与格式说明符相同的格式?发生此异常是因为您与要解析的日期不匹配。请尝试此链接中提供的答案:@srp321,在您链接使用的问题中找到的答案也是
SimpleDateFormat
,我建议您避免这样做,而是使用
java.time
。请参阅中的现代且简单的解决方案。日期字符串之间存在的TO呢???你也需要迎合它。嗯。。。解析的字符串是否遵循与格式说明符相同的格式?发生此异常是因为您与要解析的日期不匹配。请尝试此链接中提供的答案:@srp321,在您链接使用的问题中找到的答案也是
SimpleDateFormat
,我建议您避免这样做,而是使用
java.time
。请参阅中的现代且简单的解决方案。RFC 822是ARPA Internet文本消息规范。根据ISO标准,OP使用的格式是正确的8601@LaurentB请参见我的编辑..z时区名称zone name太平洋标准时间;Z区偏移量-Z+0000时的PST-0800; -08:00; 这就是我想说的。这只是解决问题的另一种方法RFC 822是ARPA互联网文本消息规范。根据ISO标准,OP使用的格式是正确的8601@LaurentB请参见我的编辑..z时区名称zone name太平洋标准时间;Z区偏移量-Z+0000时的PST-0800; -08:00; 这就是我想说的..这只是解决问题的另一种方法Instant.parse(“2018-01-16T00:07:00.000+05:30”)不起作用,它抛出了java.time.format。DateTimeParseException@Rahul尽管它与joda一起使用,但java 8 Instant不支持时区,您必须使用OffsetDateTime。最好使用java 8解决方案。Joda Time处于维护模式,并且
SimpleDateFormat
早已过时且出了名的麻烦。如果使用java 6或7,考虑添加到项目中,以便使用java 8解决方案。Time.PARSE(2018—01-16T0:07:00.0+0530)不起作用,它抛出java. Time.Frand。DateTimeParseException@Rahul虽然它与joda一起使用,但Java8Instant不支持时区,所以必须使用OffsetDateTimeIt?