我有以下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本地存储中。
答案 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处结束。