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?