TimeZone сломан в SimpleDateFormat в Android 2.3 - PullRequest
1 голос
/ 07 декабря 2010

Android 2.3 был недавно выпущен прошлой ночью.Естественно, я попробовал мое приложение на нем и обнаружил проблему с форматированием даты.Я заметил, что DateFormatter производит различные форматы.Сделайте это в простой Java-программе:

((SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.LONG, 
    DateFormat.LONG)).format(new Date());

Вывод

7 декабря 2010 г. 11:49:40 EST

Doто же самое в эмуляторе Android, и вы получаете

7 декабря 2010 г. 11:42:50 GMT GMT-05: 00

Обратите внимание на другой часовой пояс.Кто-нибудь сталкивался с этой проблемой?Есть ли другой форматер, который я могу использовать, который не зависит от реализации Java?

РЕДАКТИРОВАТЬ: Хорошо, вот более подробно, почему я думаю, что это сломано:

Используя этот код:

private final DateFormat format = 
    new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");

Я пыталсяразбирать дату но выдается следующая ошибка:

12-07 12:55:49.556: ERROR/DateDeserializer(847): Error when parsing date
    java.text.ParseException: Unparseable date: "Mon, 06 Dec 2010 17:13:35 EST"
    at java.text.DateFormat.parse(DateFormat.java:626)
    at com.currency.mobile.client.DateDeserializer
        .deserialize(DateDeserializer.java:31)
    at com.currency.mobile.client.DateDeserializer
        .deserialize(DateDeserializer.java:19)
    at org.codehaus.jackson.map.deser.SettableBeanProperty
        .deserialize(SettableBeanProperty.java:149)

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Нет ничего плохого в выводе. Вы создаете DateFormat -Instance, который зависит от значения по умолчанию Locale . Нет ничего необычного в том, что на разных машинах, в разных java-установках локаль по умолчанию различается и поэтому вывод зависит от локали. В этом случае значение по умолчанию TimeZone отличается, но два вывода в вашем вопросе представляют одну и ту же дату, напечатанную с одинаковым форматом String MMMMM d, yyyy hh:mm:ss a z.

UPDATE: parse () в Android 2.3 будет работать с часовыми поясами, такими как GMT+xxxx и т. д., но он не распознает EST, например, как действительную временную зону для анализа. Android знает о EST, если вы используете TimeZone.getTimeZone("EST").

UPDATE2:

Трехбуквенные идентификаторы часовых поясов "EST", "HST" и "MST" устарели. Не используйте их.

1 голос
/ 01 января 2011

Похоже, поддержка шаблона "EEE MMM dd HH: mm: ss zzz yyyy" также не работает.

Evgueni

1 голос
/ 07 декабря 2010

Оба одинаковых TimeZone, только разные представления

...