2014-09-04 63 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上。