英国夏令时 - BST不被SimpleDateFormat时区识别

时间:2014-09-04 14:57:34

标签: android

SimpleDateFormat解析在JUnit测试(Robolectric测试运行器)中工作,但如果在设备上运行则失败。

@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是B的{​​{1}},因此与时区相关。

确实BST有效:"GMT"

1 个答案:

答案 0 :(得分:2)

我想这里有趣的问题是为什么在Robolectric上运行正常但是无法在Android测试中运行。

Robo在JVM上运行,并且在Android和良好的ol'之间进行时区解析的行为存在差异。 Java的。

Android documentation

  

除了特殊情况" UTC"和" GMT" (在此上下文中同义,两者都对应于UTC),Android不支持Java 1.1中使用的已弃用的三字母时区ID。

Java documentation

  

TimeZone的ID,可以是缩写,例如" PST",全名,例如" America / Los_Angeles",或自定义ID,例如" GMT -8:00&#34 ;.请注意,缩写的支持仅适用于JDK 1.1.x兼容性,应使用全名。

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