Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析java.text.ParseException:不可解析的日期:";2019年9月14日星期六00:00:00 GMT+;0530(印度标准时间)“;?_Java - Fatal编程技术网

如何解析java.text.ParseException:不可解析的日期:";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"

我需要将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");

请使用以下建议的日期格式,该格式工作正常

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);