2014-09-04 87 views
1

SimpleDateFormat解析在JUnit测试(Robolectric测试转轮)中起作用,但在设备上运行时失败。英国夏令时--BST不被SimpleDateFormat识别时区

@Test 
public void testDateParse() throws ParseException { 
    String datetime = "Wed Sep 03 12:59:27 BST 2014"; 

    new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH) 
      .parse(datetime); 
} 

当它无法在设备上的异常说:

java.text.ParseException: Unparseable date: "Wed Sep 03 12:59:27 BST 2014" (at offset 20) 

偏移20是BSTB,所以它的时区相关。

事实上"GMT"工作:String datetime = "Wed Sep 03 12:59:27 GMT 2014";

回答

1

我想一个有趣的问题这是为什么这样做是否对Robolectric确定,但未能在Android试运行。

机器人运行在JVM上,并且Android和良好的Java之间的时区解析行为有所不同。

Android documentation:除特殊情况“UTC”

其他与“GMT”(这是同义在这种情况下,无论是对应于UTC),Android不支持过时的三字母时Java 1.1中使用的区域ID。

Java documentation

的ID为一个时区,要么的缩写如“PST”,一个完整的名称,如“美国/洛杉矶”,或自定义ID,例如“GMT -8:00" 。请注意,缩写的支持仅适用于JDK 1.1.x兼容性,应使用全名。

所以答案是,这3个字母的缩写不应该使用(因为它们是模棱两可),但是可以可以在JVM出于兼容性考虑使用,但不能在Android上。