如何解析java.text.ParseException:不可解析的日期:";2019年9月14日星期六00:00:00 GMT+;0530(印度标准时间)“;?
我需要将2019年9月14日星期六00:00:00 GMT+0530(印度标准时间)转换为日期。但是我越来越如何解析java.text.ParseException:不可解析的日期:";2019年9月14日星期六00:00:00 GMT+;0530(印度标准时间)“;?,java,Java,我需要将2019年9月14日星期六00:00:00 GMT+0530(印度标准时间)转换为日期。但是我越来越 java.text.ParseException: Unparseable date: "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)" exception 我试着说: SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy"
java.text.ParseException: Unparseable date: "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)" exception
我试着说:
SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
请使用以下建议的日期格式,该格式工作正常
String str = "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)";
DateFormat inputFormat = new SimpleDateFormat(
"E MMM dd yyyy HH:mm:ss 'GMT'z", Locale.ENGLISH);
Date date = inputFormat.parse(str);
java.time
此代码段的输出为:
2019-09-14T00:00+05:30[亚洲/加尔各答]
不要使用SimpleDateFormat
和Date
。这些课程设计拙劣,而且早已过时。相反,我使用的是java.time,现代java日期和时间API。和你一起工作真是太好了
验证为王。如果有一天您收到一个字符串,其中偏移量(如+0530
或-0400
)与时区不一致(如印度标准时间
或澳大利亚中央夏时制
),您将需要发现并采取适当的措施。因此,我从解析的日期时间中取出偏移量,并将其与Java从时区派生的偏移量进行比较。在这种情况下,他们确实同意了。如果不是因为需要进行此验证,那么解析ZoneDateTime
的常规方法将更为简单:
ZonedDateTime zdt = ZonedDateTime.parse(str, formatter);
指定地区。Sat
、Sep
和印度标准时间
均为英语。如果您不确保使用讲英语的区域设置进行解析,解析可能会失败。如果不是今天,那么有一天当您在具有不同语言环境设置的计算机上运行程序时
你的代码出了什么问题?
格式模式字符串中有几个错误。虽然从SimpleDateFormat
得到的错误消息相当普遍,但java.time有时更有用。让我们看看它是否能帮助我们。使用格式模式字符串:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd hh:mm:ss Z yyyy", Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(str, formatter);
这给了我们一个机会
java.time.format.DateTimeParseException:无法在索引13处分析文本“2019年9月14日星期六00:00:00 GMT+0530(印度标准时间)”
索引13已经很重要了。字符串中的索引13是2019
中19
的位置。parse
方法使用您的格式模式解析字符串,并已成功解析Sat Sep 14 20
,因为它匹配E MMM dd hh
。它知道一个小时只能是两位数字,因此只将20
解析为小时,然后解析为对象,因为格式模式在小时后指定了冒号,而20
后没有冒号。您可能已经看到,我们应该在格式模式中的dd
之后指定年份(uuu
或yyy
)。让我们修复,移动字符串中的yyyy
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss Z", Locale.ENGLISH);
java.time.format.DateTimeParseException:无法在索引25处分析文本“2019年9月14日星期六00:00:00 GMT+0530(印度标准时间)”
我们大约是现在的两倍。索引25是GMT+0530
所在的位置。因此,这与格式模式字母Z
不匹配。文档说明Z
表示区域偏移,例如+0000-0800; -08:00. 您的字符串在偏移量前面有GMT
。我们通过将其转义为包含在单引号中的文本来解决此问题:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss 'GMT'Z", Locale.ENGLISH);
java.time.format.DateTimeParseException:无法分析文本“2019年9月14日星期六00:00:00 GMT+0530(印度标准时间)”,在索引33处找到未分析的文本
索引33是GMT+0530
之后的空格。格式模式字符串到此结束。有一种方法可以指示解析只解析尽可能多的字符串,但这会使我们无法验证时区,所以我们不要求助于此。小写的z
表示时区名称:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH);
java.time.format.DateTimeParseException:无法分析文本“2019年9月14日星期六00:00:00 GMT+0530(印度标准时间)”:无法从TemporalAccessor获取ZonedDateTime:{NanoOfSecond=0,MinuteOfHour=0,MilliOfSecond=0,MicroOfSecond=0,OffsetSecondofSeconds=19800,HourOfAmPm=0,SecondOfMinute=0},ISO,亚洲/加尔各答解析为2019-09-14,类型为java.time.format.Parsed
这是一个新的。需要注意的细节是HourOfAmPm=0
。我们不打算在上午或下午安排一个小时,只是一天中的一个小时。错误是小写的hh
表示小时。对于从00到23的小时,我们需要大写字母HH
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy HH:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH);
现在解析成功并给出与上面相同的结果。我想说的是,java.time正在更加努力地帮助我们获得正确的格式模式
链接
- 解释如何使用java.time
- 具有指定格式的图案字母
yyyy
位于模式的错误部分,需要去掉(印度标准时间)
部分,因为它不是日期模式的一部分。我建议您不要使用SimpleDataFormat
和date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。而是使用ZonedDateTime
和DateTimeFormatter
,两者都来自。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy HH:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH);