Java - 无法解析的日期,需要格式匹配" GMT-0400"

时间:2012-02-28 21:57:00

标签: java date sencha-touch simpledateformat web-sql

我有以下Java:

DateFormat formatter = new SimpleDateFormat(
    "EEE MMM dd yyyy HH:mm:ss zZ (zzzz)", Locale.ENGLISH);
Calendar cal = Calendar.getInstance();
cal.set(2011, Calendar.APRIL, 1);
out.println(formatter.format(cal.getTime()));
out.println();

Date date;
try {
    date = formatter
        .parse("Fri Apr 01 2011 00:00:00 GMT-0400 (Eastern Daylight Time)");
} catch (ParseException e) {
    out.println("Failed to parse date: " + e.getMessage());
    e.printStackTrace(out);
}

这是在一个servlet中,Calendar构造的日期是:

  

Fri Apr 01 2011 16:42:24 EDT-0400(东部夏令时间)

这看起来与我尝试解析的日期字符串的格式相同,但EDT-0400与期望的GMT-0400除外。尝试解析日期字符串时代码失败:

  

java.text.ParseException:Unparseable date:“Fri Apr 01 2011 00:00:00 GMT-0400(Eastern Daylight Time)”

我如何解析这样的字符串?这是来自Sencha Touch 1.1.1模型中的JavaScript日期,存储在WebSQL本地存储中。

2 个答案:

答案 0 :(得分:3)

出于某种原因,GMT-0400不起作用,而UTC-0400正在工作。您可以用UTC替换GMT。

请注意,此部分将被完全忽略 - 时区将从括号中的内容(至少在我的机器上,JDK 6)中解析

答案 1 :(得分:2)

我调试了SimpleDateFormat,它似乎只会解析GMT-04:00而不是GMT-0400

它将接受UTC-0400,但它会丢弃小时/分钟修饰符,并将错误地将其解析为UTC。 (除了GMT

之外,任何其他时区指定都会发生这种情况

它还会正确解析-0400,因此最强大的解决方案可能只是从日期字符串中删除GMT

故事的结果是SimpleDateFormat不过是简单的。

更新:另一个教训是我可以通过将ParsePosition对象传递给parse()方法来节省大量时间:

    DateFormat formatter = new SimpleDateFormat(
        "EEE MMM dd yyyy HH:mm:ss zzzz", Locale.ENGLISH);
    Date date;
    ParsePosition pos = new ParsePosition( 0 );
    date = formatter
        .parse("Fri Apr 01 2011 00:00:00 UTC-0400", pos);
    System.out.println( pos.getIndex() );

将打印出28,表示解析在UTC之后的字符索引28处结束。