2014-09-04 2 views
1

SimpleDateFormat Анализ синтаксического анализа выполняется в тесте JUnit (Robolectric test runner), но сбой при запуске на устройстве.Британское летнее время - 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 является B из BST, так что часовой пояс связаны между собой.

Действительно "GMT" работы: String datetime = "Wed Sep 03 12:59:27 GMT 2014";

ответ

1

Я думаю, интересный вопрос здесь почему это хорошо работать на Robolectric, но не запускается на тест Android.

Robo работает на JVM, и существует различие в поведении для разбора часового пояса между Android и хорошей версией Java.

В Android documentation:

Помимо особых случаев «UTC» и «GMT» (которые являются синонимами в данном контексте, как, соответствующий UTC), Android не поддерживают устаревшее время три буквы идентификаторы зон, используемые в Java 1.1.

В Java documentation:

идентификатор для TimeZone, либо аббревиатура, такие как "PST", полное название, например "America/Los_Angeles", или пользовательские ID, такие как «GMT -8: 00" . Обратите внимание, что поддержка сокращений предназначена только для совместимости JDK 1.1.x и должны использоваться полные имена.

Таким образом, ответ в том, что 3-буквенные сокращения не должны использоваться (потому что они неоднозначны), но могут быть использованы на JVM по соображениям совместимости, но не на Android.

Смежные вопросы