2010-12-07 28 views
1

Android 2.3 a été récemment publié la nuit dernière. Donc, naturellement, j'ai essayé mon application à ce sujet et j'ai constaté qu'il y avait un problème de formatage de la date. J'ai remarqué que le DateFormatter produit différents formats. Donc faire dans un programme Java simple:TimeZone cassé dans SimpleDateFormat dans android 2.3

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

sortie est

7 Décembre, 2010 11:49:40 EST

Faites la même chose dans un émulateur Android et vous obtenez

7 Décembre, 2010 11:42:50 GMT-05: 00

Notez le fuseau horaire différent. Est-ce que quelqu'un a couru à ce problème? Y at-il un autre formateur que je peux utiliser qui ne dépend pas de l'implémentation de Java?

EDIT: Ok, donc voici plus en détail les raisons pour lesquelles je pense que cela est cassé:

En utilisant ce code:

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

J'ai essayé d'analyser une date, mais l'erreur suivante est lancée :

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) 
+0

ps, ​​si je puis supprimer EST et z tout fonctionne –

Répondre

1

Il n'y a rien de mal à la sortie. Vous créez un DateFormat -Instance qui dépend de la valeur par défaut Locale. Il n'est pas inhabituel que sur des machines différentes, des installations Java différentes, les paramètres régionaux par défaut varient et donc la sortie des opérations dépendantes des paramètres régionaux. Dans ce cas, la valeur par défaut TimeZone est différente, mais les deux sorties de votre question représentent la même Date, imprimée avec le même format Chaîne MMMMM d, yyyy hh:mm:ss a z.

MISE À JOUR: parse() dans Android 2.3 fonctionnera avec TimeZones comme GMT+xxxx etc, mais il ne reconnaît pas EST par exemple comme TimeZone valable pour l'analyse syntaxique. Android connaît environ EST si vous utilisez TimeZone.getTimeZone("EST").

MAJ2:

Three-letter timezone IDs "EST", "HST", and "MST" are deprecated. Ne les utilisez pas.

+0

J'ai ajouté plus de détails à la raison pour laquelle je pense que c'est cassé. –

+0

si vous utilisez le 'z' mais avec GMT-00: 05 cela fonctionne? peut-être google supprimé la présentation de texte et utiliser uniquement un formulaire numérique? – codeScriber

+0

Non, si enlever 'z' et EST alors cela fonctionne. Actuellement, j'ai une solution piratée pour résoudre ce problème, mais cela ne s'est pas produit en 2.3. J'ai essayé d'utiliser Locale.US aussi et toujours pas de chance –

1

Les deux sont identiques TimeZone tout autre représentation

+0

Oui je remarquai que. Sauf que DateFormat.parse() est cassé maintenant. Parce qu'il ne supporte pas ce modèle –

+0

@Amir: Pourquoi pensez-vous que parse() ne peut pas gérer cela? –

+0

Je vais ajouter plus de détails dans une seconde –

1

On dirait que le support pour le modèle "EEE MMM dd HH: mm: ss zzz yyyy" est également cassé.

Evgueni

+0

J'ai: 12-31 16: 23: 20.874: WARN/System.err (548): java.text.ParseException: Date impossible: "Lun Dec 20 22:15:23 UTC 2010 " 12-31 16: 23: 20.884: WARN/System.err (548): à java.text.DateFormat.parse (DateFormat.java:626) – Evgueni