我需要将Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)
转换为日期。但是我得到
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");
答案 0 :(得分:2)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"EEE MMM dd uuuu HH:mm:ss 'GMT'xx (zzzz)", Locale.ENGLISH);
String str = "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)";
TemporalAccessor parsed = formatter.parse(str);
ZonedDateTime zdt = ZonedDateTime.from(parsed);
// Check the offset against the time zone for validation
ZoneOffset offset = ZoneOffset.from(parsed);
if (offset.equals(zdt.getOffset())) {
System.out.println(zdt);
} else {
System.err.println("Offset doesn’t match");
}
此代码段的输出为:
2019-09-14T00:00 + 05:30 [亚洲/加尔各答]
请勿使用SimpleDateFormat
和Date
。该类的设计不佳,并且已经过时了。相反,我使用的是java.time,这是现代的Java日期和时间API。与之合作真是太好了。
验证为王。如果有一天您收到的字符串中,偏移量(如+0530
或-0400
)与时区(如{{1 }}或India Standard Time
),您将希望发现并采取适当的措施。因此,我从解析的日期时间中取出偏移量,并将其与Java从时区得出的偏移量进行比较。在这种情况下,他们确实同意。如果不需要进行此验证,则解析Australian Central Daylight Time
的正常方法将更为简短:
ZonedDateTime
指定语言环境。 ZonedDateTime zdt = ZonedDateTime.parse(str, formatter);
,Sat
和Sep
用英语。如果您不确定使用英语的语言环境进行解析,则解析很可能会失败。如果不是今天,则是一天,当您在具有不同区域设置的计算机上运行程序。
格式格式字符串中有几个错误。尽管您从India Standard Time
得到的错误消息很笼统,但java.time有时会更有帮助。让我们看看它是否对我们有帮助。使用格式模式字符串:
SimpleDateFormat
这给了我们一个
java.time.format.DateTimeParseException:无法在索引13处解析文本'Sat Sep 14 2019 00:00:00 GMT + 0530(India Standard Time)'
索引13已经存在。字符串中的索引13是 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd hh:mm:ss Z yyyy", Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(str, formatter);
中19
的位置。 2019
方法使用您的格式模式来解析字符串,并已成功解析parse
,因为它与Sat Sep 14 20
相匹配。它知道一个小时只能是2位数字,因此只能将E MMM dd hh
解析为小时,然后解析为对象,因为格式模式在小时后指定了一个冒号,而在20
之后没有任何冒号。您现在可能已经看到,我们应该在格式模式20
之后指定年份(uuuu
或yyyy
)。修复一下,将dd
移动到字符串中:
yyyy
java.time.format.DateTimeParseException:无法在索引25处解析文本'Sat Sep 14 2019 00:00:00 GMT + 0530(India Standard Time)'
我们要加倍。索引25是 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss Z", Locale.ENGLISH);
所在的位置。因此,这与格式模式字母GMT+0530
不匹配。文档说Z
用于区域偏移,例如+0000; -0800; -08:00。您的字符串在偏移量前面有Z
。我们通过将其转义为用单引号引起来的文字文本来解决它:
GMT
java.time.format.DateTimeParseException:无法解析文本'Sat Sep 14 2019 00:00:00 GMT + 0530(India Standard Time)',未分析的文本位于索引33
索引33是 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss 'GMT'Z", Locale.ENGLISH);
之后的空格。您的格式模式字符串到此结束。有一种方法可以指示解析只解析尽可能多的字符串,但这会使我们失去对时区的验证,因此我们不要诉诸于此。小写的GMT+0530
用于时区名称:
z
java.time.format.DateTimeParseException:无法解析文本'Sat Sep 14 2019 00:00:00 GMT + 0530(India Standard Time)':无法从TemporalAccessor获取ZonedDateTime:{NanoOfSecond = 0,MinuteOfHour = 0,MilliOfSecond = 0,MicroOfSecond = 0,OffsetSeconds = 19800,HourOfAmPm = 0,SecondOfMinute = 0},ISO,Asia / Kolkata已解析为java.time.format.Parsed类型的2019-09-14
这是一个新的。需要注意的细节是 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH);
。我们不打算在一天中的一个小时内在字符串中的AM或PM处加上一个小时。错误是小写的HourOfAmPm=0
一小时。对于从00到23的一天中的小时,我们需要使用大写字母hh
:
HH
现在解析成功,并给出与上面相同的结果。我想说的是,java.time付出了更多努力来帮助我们正确设置格式模式。
DateTimeFormatter
,其中包含格式模式字母的说明。答案 1 :(得分:0)
请使用以下建议的日期格式,该格式可以正常工作
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);