2010-10-27 10 views
30

Je ne pouvais pas trouver cela nulle part. Je récupère du JSON à partir d'une API qui renvoie des dates JSON standard. Vous pouvez voir le format en exécutant ce code dans une console JavaScript:date JSON à Java date?

> new Date().toJSON(); 
"2010-10-27T11:58:22.973Z" 

Eh bien, en fait, l'API je travaille avec ne retournera pas la partie milliseconde, et parfois il retourne un fuseau horaire au lieu de Z, donc les dates peuvent ressembler à une de ces:

  • 2010-10-27T11:58:22Z
  • 2010-10-27T11:58:22+03:00

L'analyse de ces types de dates est quelque peu fastidieuse. Est-il possible d'analyser ces types de dates, en utilisant org.json?

Ma solution actuelle est:

public static Date parseDateTime(String dateString) { 
    if (dateString == null) return null; 
    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); 
    if (dateString.contains("T")) dateString = dateString.replace('T', ' '); 
    if (dateString.contains("Z")) dateString = dateString.replace("Z", "+0000"); 
    else 
     dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1); 
    try { 
     return fmt.parse(dateString); 
    } 
    catch (ParseException e) { 
     Log.e(Const.TAG, "Could not parse datetime: " + dateString); 
     return null; 
    } 
} 

Ugh!

+0

Dans un commentaire ci-dessous, vous avez mentionné que vous implémentez pour Android. Avez-vous essayé Android 'SimpleDateFormat'' ZZZZZ'? –

Répondre

17

Ce format DateTime est en réalité ISO 8601 DateTime. JSON ne spécifie aucun format particulier pour les dates/heures. Si vous un peu Google, vous trouverez beaucoup d'implémentations pour l'analyser en Java.

Here's one

Si vous êtes ouvert à l'aide de quelque chose autre que Java intégré de date/heure/cours du calendrier, je suggère également Joda Time. Ils offrent (parmi beaucoup de choses) un ISODateTimeFormat pour analyser ces sortes de chaînes.

+0

+1 pour la recommandation de temps Joda –

+0

Hmm, intéressant. Leur solution est assez similaire à la mienne :). C'est bizarre que Java n'ait pas ce built-in, si c'est standard. – Felix

+0

Quant à Joda Time, mon projet est sur Android et je veux utiliser le moins de librairies externes possible. Merci pour le conseil, cependant. – Felix

6

Si vous devez prendre en charge plus d'un format, vous devrez faire correspondre votre entrée et analyser en conséquence.

final DateFormat fmt; 
if (dateString.endsWith("Z")) { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
} else { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
} 

Je suppose que vous avez affaire à un bogue dans l'API que vous utilisez qui a cité le modèle de date de fuseau horaire Z quelque part ...

+0

Le littéral Z est valide - c'est une autre façon de dire «+00: 00», c'est-à-dire l'heure UTC. Il signifie «zoulou»: «... également connu sous le nom de" temps zoulou ", en particulier dans l'armée américaine ..." ([Wikipedia] (http://en.wikipedia.org/wiki/ Temps universel coordonné)) –

13

Notez que modèle de format SimpleDateFormat Z est pour RFC 822 fuseau horaire et le modèle X est pour ISO 8601 (cette norme prend en charge les noms de fuseau horaire à une seule lettre comme Z pour Zulu).

Donc new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX") produit un format qui peut analyser à la fois "2013-03-11T01:38:18.309Z" et "2013-03-11T01:38:18.309+0000" et vous donnera le même résultat. Malheureusement, autant que je sache, vous ne pouvez pas obtenir ce format pour générer la version Z for Zulu, ce qui est ennuyeux.

J'ai vraiment plus de problèmes du côté JavaScript pour gérer les deux formats.