2010-03-16 15 views
14

Ich muss eine RFC 2822 String Darstellung eines Datums in Java analysieren. Ein Beispiel String ist hier:Parsing RFC 2822 Datum in JAVA

Sa 13 Mär 2010 11:29:05 -0800

Es sieht ziemlich böse, so wollte ich sicherstellen, dass ich alles richtig tat und würde in seltsam laufen Probleme später mit dem Datum wird falsch interpretiert, entweder durch AM-PM/Militärzeit Probleme, UTC Zeitprobleme, Probleme, die ich nicht antizipieren, etc ...

Vielen Dank!

+3

Haben Sie versucht, 'java.text.SimpleDateFormat' zu verwenden? – skaffman

+0

Das sieht nach dem richtigen aus, ich habe mir Sorgen darüber gemacht, was die richtige Formatzeichenkette auch ist, es sieht so aus, als wäre es etwas, das leicht zu vermasseln wäre. Dies scheint die richtige Zeichenfolge für RFC 2822 zu sein: "EEE, d MMM JJJJ HH: mm: ss Z" (gemäß der Antwort unten) –

+1

nicht "d", sondern "dd". –

Antwort

19

Dies ist schnell Code, der das tut, was Sie (mit SimpleDateFormat)

String rfcDate = "Sat, 13 Mar 2010 11:29:05 -0800"; 
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z"; 
SimpleDateFormat format = new SimpleDateFormat(pattern); 
Date javaDate = format.parse(rfcDate); 

//Done. 

PS fragen. Ich habe hier keine Ausnahmen und Nebenläufigkeiten behandelt (SimpleDateFormat wird beim Parsingdatum nicht synchronisiert).

+0

Verwenden Sie diesen Link http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html für die letzten akzeptablen Werte – rajadilipkolli

19

Wenn Ihre Anwendung eine andere Sprache als Englisch verwendet, sollten Sie das Gebietsschema für das Datum Parsen/Formatierung erzwingen, indem Sie einen alternativen Simple Konstruktor:

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z"; 
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.ENGLISH); 
+4

Die Einstellung der Ländereinstellung ist unbedingt erforderlich. Das Android-Javadoc für Locale empfiehlt die Verwendung von Locale.US für die Computer-zu-Computer-Kommunikation. [link] (https://developer.android.com/reference/java/util/Locale.html) –

+0

+1 Locale.ROOT wäre auch eine gute Wahl, ist aber nicht auf allen Systemen verfügbar. – Jules

+0

@jasongilbert Können Sie erklären, warum Sie sagen, dass das Gebietsschema "unbedingt erforderlich" ist? Laut den Dokumenten ist es nicht: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html - aber vielleicht meintest du "benötigt, wenn ..." und es ist die Fortsetzung des "Wenn", an dem ich interessiert bin ... –

4

Beachten Sie bitte, dass die [Tag- of-week ","] ist in RFC-2822 optional, daher enthalten die vorgeschlagenen Beispiele nicht alle RFC-2822-Datumsformate. Zusätzlich erlaubte der Datumstyp RFC-822 viele verschiedene Zeitzonen-Notationen (obs-zone), die nicht durch den Formatbezeichner "Z" abgedeckt sind.

Ich denke, es gibt keinen einfachen Ausweg, außer nach "," und "- | +" zu suchen, um zu bestimmen, welches Muster zu verwenden ist.

+1

+1 für den Hinweis, dass der Wochentag optional ist. Ich stelle einen Wasserfall von Versuchen/Fängen mit verschiedenen Mustern auf, um einfach Variationen auszuprobieren, bis es einen gefunden hat, der funktioniert. –

+0

nicht nur der 'Wochentag' ist optional, auch die Sekunden in der Tageszeit werden als optional deklariert:' Uhrzeit = Stunde ':' Minute [":" Sekunde] ' –