ParseException试图从带有+的字符串中解析Date

时间:2018-01-19 07:01:08

标签: java date datetime-parsing unparseable

我从字符串

解析日期时遇到问题

这是我的约会

String startedFrom = "Fri,+31+Dec+3999+23:00:00+GMT"

DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy kk:mm:ss z", Locale.ENGLISH);

Date result =  df.parse(startedFrom);

我做错了什么?

我得到例外

java.text.ParseException: Unparseable date: "Fri,+31+Dec+3999+23:00:00+GMT"

2 个答案:

答案 0 :(得分:1)

DateFormat df = new SimpleDateFormat("EEE,'+'dd'+'MMM'+'yyyy'+'kk:mm:ss'+'z",
        Locale.ENGLISH);

但是,如果startedFrom值实际上是添加到URL的URL编码参数(如使用GET方法的HTML表单中),那么'+'将作为空格' '到达,因此你的原始格式是正确的。

答案 1 :(得分:1)

首先,请使用java.time及其DateTimeFormatter类。 SimpleDateFormat是众所周知的麻烦,并且与Date课程一起长期过时。 java.time是现代Java日期和时间API,使用起来非常好。

其次,Joop Eggen在his answer中是正确的,您的字符串看起来像是最初为Fri, 31 Dec 3999 23:00:00 GMT的URL编码参数。这听起来更有可能,因为这是一种称为RFC 1123的标准格式,并且通常与HTTP一起使用。因此,用于获取URL参数的库应该为您解析字符串。然后它很简单,因为已经为你定义了格式化程序:

    String startedFrom = "Fri, 31 Dec 3999 23:00:00 GMT";
    OffsetDateTime result 
            = OffsetDateTime.parse(startedFrom, DateTimeFormatter.RFC_1123_DATE_TIME);
    System.out.println(result);

打印

3999-12-31T23:00Z

如果您无法让您的资料库进行网址解码,请使用URLDecoder

自行完成
    String startedFrom = "Fri,+31+Dec+3999+23:00:00+GMT";
    try {
        startedFrom = URLDecoder.decode(startedFrom, StandardCharsets.UTF_16.name());
    } catch (UnsupportedEncodingException uee) {
        throw new AssertionError("UTF_16 is not supported — this should not be possible", uee);
    }

现在按上述步骤进行。

您当然也可以定义一个格式化程序来解析字符串中的字符串。不过,我不知道你为什么要这么做。如果你这样做,你只需要将它们放在格式模式字符串中:

    DateTimeFormatter formatterWithPluses
            = DateTimeFormatter.ofPattern("EEE,+d+MMM+yyyy+H:mm:ss+z", Locale.ROOT);
    ZonedDateTime result = ZonedDateTime.parse(startedFrom, formatterWithPluses);

这次我们得到一个ZonedDateTime GMT作为时区的名称:

3999-12-31T23:00Z[GMT]

根据您需要的日期时间,您可以致电OffsetDateTimeInstant将其转换为result.toOffsetDateTime()result.toInstant()