Java, SimpleDateFormat создает ParseException на немецком языке. Работает на английском языке

Мое приложение вызывает ленту Twitter и ленту блога, конечно, обе содержат дату публикации. Когда мой телефон настроен на английский язык, он работает, когда я переключаюсь на голландский или немецкий, он не работает. Рассматриваемый код даже не обращается к локали, и входные значения также не зависят от локали.

Код нарушения:

tweets — это JSONObject, содержащий полную ленту Twitter.

final SimpleDateFormat formatter = 
    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final SimpleDateFormat parser = 
    new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");

for (int i = 0; i < tweets.length(); i++) {
    final JSONObject tweet = tweets.getJSONObject(i);

    // The following line is where the failure occurs:
    values.put(KEY_TWEET_DATE, formatter.format(parser.parse(tweet
        .getString("created_at"))));
}

Это работает, пока мой язык английский.

Как только я переключаюсь на немецкий или голландский (в моем приложении есть переводы для этих двух языков, я пока не пробовал ни один другой), я получаю такую ​​ошибку:

WARN/System.err(28273): java.text.ParseException: Unparseable date: Wed Jun 29 10:55:41 +0000 2011
WARN/System.err(28273):     at java.text.DateFormat.parse(DateFormat.java:645)
WARN/System.err(28273):     at squirrel.DeaddropDroid.DeaddropDB.updateTwitter(DeaddropDB.java:1453)

«Неразборная дата» — это правильная дата в ожидаемом формате. Моя строка формата предназначена для анализа этой точной даты. И, как уже говорилось, когда я переключаю свой телефон на английский язык, он работает нормально. Это тот же код: ошибка возникает, даже когда я переключаю локаль во время работы приложения, и исчезает, когда я переключаю локаль обратно.


person Wouter    schedule 29.06.2011    source источник


Ответы (2)


Если вам нужно выполнить синтаксический анализ в определенной локали, передайте ее в конструктор SimpleDateFormat:

final SimpleDateFormat parser =
    new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US);

Это означает, что он всегда будет использовать локаль США для названий дней, месяцев и т. д.

person Jon Skeet    schedule 29.06.2011
comment
Не удалось отредактировать первый комментарий :( Ну вот снова! - Это очень быстрый ответ :) И совершенно правильно. Только что проверил, работает. Я никогда не думал, что локаль повлияет на это... спасибо!! - person Wouter; 29.06.2011
comment
@AshishDwivedi: боюсь, не работа слишком расплывчата, чтобы я мог дать какой-либо ответ. Я подозреваю, что, возможно, стоит задать новый вопрос, убедившись, что вы предоставили много деталей. - person Jon Skeet; 17.04.2013

Ты пытался:

SimpleDateFormat parser = 
    new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy",Locale.getDefault());
person tdtje    schedule 29.06.2011
comment
Строка даты/времени взята из внешнего источника, поэтому не имеет ничего общего с локалью моего устройства. Как и в принятом ответе выше, мне действительно нужно вручную установить правильную локаль для синтаксического анализа этой строки! - person Wouter; 29.06.2011