Почему этот разбор SimpleDataFormat не работает на Android? - PullRequest
5 голосов
/ 08 ноября 2011
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");

sdf.parse("Sun Dec 13 10:00:00 UTC 2009")

результат

java.text.ParseException: Неразборчивая дата: воскресенье 13 декабря 10:00:00 UTC 2009

Примечание. Кажется, что этот код работает в обычном приложении Java, но на Android он не работает.

Ответы [ 2 ]

8 голосов
/ 08 ноября 2011

Это не для меня - возможно, в вашей локали по умолчанию используются разные названия месяцев?Укажите языковой стандарт для формата.

// Will definitely work
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy",
                                      Locale.US);

// Will definitely not work
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy",
                                      Locale.FRANCE);

// Might work - depends on default locale
DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy")

(Проблема заключается в названиях дней недели и месяцев года, которые явно зависят от культуры. Разделители даты и времени также могут различаться.)

РЕДАКТИРОВАТЬ: Странно, что у вас все еще есть проблемы.Просто для проверки, пожалуйста, попробуйте запустить следующую короткую, но полную программу:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;

public class Test {

    public static void main(String[] args) throws Exception {        
        DateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy",
                                              Locale.US);
        sdf.parse("Sun Dec 13 10:00:00 UTC 2009");
    }
}

Если это не сработает, попробуйте удалить часть часового пояса как из шаблона, так и из текста.Интересно, есть ли у него проблемы с этим.

РЕДАКТИРОВАТЬ: Если реализации Android SimpleDateFormat не удается проанализировать часовой пояс, вы, вероятно, можете просто использовать:

text = text.replace(" UTC ", " ");
Date parsed = sdf.parse(text);

.... установив часовой пояс на анализаторе в UTC, конечно.Возможно, вы сначала захотите проверить, что содержит"UTC", на случай, если ваш формат данных изменится.

3 голосов
/ 08 ноября 2011

Ваш формат выглядит правильно.Возможно ли, что вы не используете английский язык?Форматер примет вашу системную локаль, и это может привести к различным именам для 'sun' и 'dec'

...