2010-11-12 18 views
2

J'ai recherché partout et ne trouve pas d'explication ou de raison pour que cela se produise, mais la méthode parse (String) de DateFormat n'analyse pas mon String correctement.Analyse d'une chaîne dans Date avec DateFormat pas analyse correcte

J'essaie d'analyser une chaîne dans le format de date qui est utilisé pour les en-têtes HTTP et obtenu aussi loin que faire la chaîne sur son propre tels que:

Thu, 11 Nov 2010 18:34:22 GMT 

Ce qui est dans le format:

E, d MMM yyyy HH:mm:ss z 

Mais quand je l'utilise df.parse(dateStr); ce que je sors de celui-ci:

Thu Nov 11 18:34:22 GMT 2010 

ce qui est Rien de tel que ce que je voulais, pourquoi l'année est-elle maintenant après le GMT? Pourquoi n'y a-t-il plus de virgule? Et pourquoi la date est-elle après le mois?

Je suis complètement confus à ce sujet maintenant et ne peux pas trouver une solution, mais j'ai vraiment besoin de la date pour être dans ce format. La virgule est-elle en train de gâcher les choses? ou les deux-points?

Merci pour votre temps,

Infinitifizz

post-scriptum

J'ai oublié de le mentionner mais j'ai essayé dateformat.setLenient (false) et cela ne fait aucune différence.

PPS

Je suis en train de faire pour comparer les dates avec date1.before (date2) et après() etc pour voir si l'on est plus récente que l'autre, mais je ne peux pas le faire parce que le l'analyse ne fonctionne pas.

Même s'ils se ressemblent mais que le format est différent, ils ne sont pas identiques car après avoir appelé getTime() sur les deux (lorsque j'ai fourni 2 dates identiques), les longs ne sont pas identiques. Comme la date est:

Jeu 11 novembre 2010 19:38:52 GMT pour un lastModified() sur un fichier

Si je la chaîne « Jeu, 11 novembre 2010 19:38:52 GMT »et puis de comparer leurs positions longues conversion une fois que la chaîne à une date à l'aide parse(), puis en appelant getTime() à cette date que je reçois:

lastModified = 1289504332671 fromString = 1289504332000

Il est seulement le dernier 3 chiffres qui sont différents, cela a-t-il une signification?

Merci encore pour votre temps et désolé de ne pas mettre ce bit dans la première,

Infinitifizz

Répondre

8

Le format de résultat est le format par défaut de Date#toString() (cliquer sur le lien pour voir le javadoc). Vous faites apparemment un System.out.println(date). Vous souhaitez utiliser SimpleDateFormat#format() à la place avec un autre motif pour le formater dans le format souhaité. Par exemple.

String newDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); 

Mise à jour: Vous ne devriez pas se soucier du format lors de l'utilisation Date. Vous devez seulement vous soucier du format à ce moment où Date doit être converti (affiché) en String. En ce qui concerne la différence d'horodatage, le Date utilise une précision en millisecondes pour l'horodatage tandis que l'en-tête HTTP utilise une seconde précision. Vous souhaitez diviser les horodatages par 1000 avant de les comparer.

+0

bonne réponse (+1). J'ai immédiatement cessé de travailler sur le mien quand celui-ci est apparu. –

+0

Je ne suis pas sûr de vous avoir compris. Je veux obtenir une date à partir d'une chaîne, pas une chaîne à partir d'une date, c'est pourquoi j'utilise parse() pas format(). –

+0

Ah désolé, je pense que je comprends! Donc, parce que je n'utilise que System.out.println (dateFromString), il utilise la valeur par défaut toString() plutôt que celle formatée. Donc, comme un morceau de code complet, je reçois une chaîne (de la date dans le format que je veux) l'analyse dans une date que je veux utiliser, mais ce n'est pas dans le format que je veux, puis en utilisant format() pour prendre -il du format par défaut dans le format que je veux? Edit: "... format dans le format que je veux pour l'afficher?" –