2009-10-12 4 views
0

J'ai un problème bizarre, je dois analyser une chaîne de date qui ressemble 1997-02-14T00:00:00.0000000+05:30. La chose étrange au sujet de la chaîne de date est l'information de fuseau horaire. C'est +05:30 au lieu de l'habituel +0530.Parsing une chaîne de date à l'aide java.text.SimpleDateFormat

J'ai la chaîne de format de base prêt, yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ qui aurait travaillé comme un charme, sinon pour l'information TZ.

Quelqu'un peut-il suggérer une solution à ce problème? Y at-il une sorte de chaîne de format qui peut gérer ce genre d'infos TZ?

Merci d'avance.

Répondre

3

Pouvez-vous pas prétraiter avec une expression régulière et remplacer le fuseau horaire par exemple

String dateAndTime = ... 
String preprocessed = dateAndTime.replace("([+-])(\\d\\d):(\\d\\d)$", "$1$2$3"); 
// Go on with your life 
2

SimpleDateFormat devrait l'accepter. De the doc:

Pour l'analyse, les fuseaux horaires généraux sont également acceptés.

et ces are specified as:

GMTOffsetTimeZone: 
      GMT Sign Hours : Minutes 

qui ressemble à ce que vous avez?

Si cela échoue, alors les Joda DateTimeFormat prétend le faire. Je serais tenté d'utiliser Joda, pour de nombreuses raisons (API plus cohérente et plus simple, sécurité des threads pour les formateurs/parseurs, etc.)

+0

Je viens de le tester, mais cela ne fonctionne pas: nouveau SimpleDateFormat ("EEE, d MMM aaaa HH: mm: ss z").parse ("mer, 4 juil. 2001 12:08:56 -07: 00") – sfussenegger

+0

Que se passe-t-il si (dites) vous avez GMT-07: 00 (j'apprécie que ce n'est pas ce que vous avez actuellement) –

+0

Oui, cela fonctionne après le début GMT au fuseau horaire ("mer, 4 juil. 2001 12:08:56 GMT-07: 00"). Mais étant donné le format de la question, ceci (en utilisant 'z' au lieu de 'Z' dans la chaîne de format) n'est toujours pas un moyen viable d'analyser ces dates. – sfussenegger

5

J'ai moi-même examiné ce problème il y a plusieurs mois. Si je me souviens bien, SimpleDateFormat n'est pas assez flexible pour accepter d'autres formats de fuseau horaire (le mien était +530). Ce que j'ai fait était une simple étape de pré-traitement - c'est-à-dire essayer de supprimer le deux-points avant de passer la chaîne à SimpleDateFormat.

2

Est-ce par hasard une chaîne de date qui vient d'un fichier XML (format ISO8601)? Malheureusement, il n'y a pas moyen (facile) d'analyser cela avec SimpleDateFormat, exactement en raison du ':' dans la partie fuseau horaire que SimpleDateFormat n'a aucun moyen de traiter correctement.

Jetez un oeil à my answer in this other question sur la façon d'analyser des chaînes de datetime XML.

2

Bien sûr, il y a toujours le hack de pour prétraiter votre chaîne.

Si personne ne trouve une meilleure réponse, ce serait déjà quelque chose. Vous pouvez l'encapsuler dans une méthode, avec un commentaire pour expliquer le hack.

0

Je pense qu'il devrait utiliser la méthode replaceAll du String pour regular expression.

String dateAndTime = ... 
String preprocessed = dateAndTime.replaceAll("(GMT)([+-])(\\d\\d):(\\d\\d)", "$2$3$4"); 
Questions connexes