如何解决java.text.ParseException:无法解析的日期:“ Sat Sep 14 2019 00:00:00 GMT + 0530(印度标准时间)”?

时间:2019-09-09 09:24:18

标签: java

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

2 个答案:

答案 0 :(得分:2)

java.time

    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 [亚洲/加尔各答]

请勿使用SimpleDateFormatDate。该类的设计不佳,并且已经过时了。相反,我使用的是java.time,这是现代的Java日期和时间API。与之合作真是太好了。

验证为王。如果有一天您收到的字符串中,偏移量(如+0530-0400)与时区(如{{1 }}或India Standard Time),您将希望发现并采取适当的措施。因此,我从解析的日期时间中取出偏移量,并将其与Java从时区得出的偏移量进行比较。在这种情况下,他们确实同意。如果不需要进行此验证,则解析Australian Central Daylight Time的正常方法将更为简短:

ZonedDateTime

指定语言环境。 ZonedDateTime zdt = ZonedDateTime.parse(str, formatter); SatSep用英语。如果您不确定使用英语的语言环境进行解析,则解析很可能会失败。如果不是今天,则是一天,当您在具有不同区域设置的计算机上运行程序。

您的代码出了什么问题?

格式格式字符串中有几个错误。尽管您从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之后指定年份(uuuuyyyy)。修复一下,将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付出了更多努力来帮助我们正确设置格式模式。

链接

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