2008-11-14 13 views
32

Ich möchte einen Zeitstempel mit einem PST-Offset ausgeben (z. B. 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat scheint keine Zeitzonenversätze im Format Stunde: Minute auszugeben, es schließt den Doppelpunkt aus. Gibt es eine einfache Möglichkeit, diesen Zeitstempel in Java zu bekommen?Ausgabe RFC 3339 Zeitstempel in Java

// I want 2008-11-13T12:23:30-08:00 
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date()); 
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference? 

Auch SimpleDateFormat kann nicht richtig das obige Beispiel analysieren. Es wirft eine ParseException.

// Throws a ParseException 
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00") 

Antwort

31

Beginnend in Java 7 gibt es die X Musterzeichenfolge für ISO8601 Zeitzone. Verwenden Sie für Strings in dem von Ihnen beschriebenen Format XXX. See the documentation.

Probe:

System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX") 
     .format(new Date())); 

Ergebnis:

2014-03-31T14:11:29+02:00 
+0

Ich bekomme ParseException beim Parsen "2017-12-12T02: 01: 43.924-08: 00", die ich von Google Cloud APIs bekommen habe –

+0

@pujanjain Das hat Millisekunden, die dieses Muster nicht enthält. –

2
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ"); 

Ist das nicht, was Sie genau brauchen?

+0

Nein. Wenn Sie versuchen, den oben angegebenen Zeitstempel zu analysieren, wird ParseException ausgelöst. – Cristian

+0

Es funktioniert für "2008-11-13T13: 23: 30-0800". – FoxyBOA

+3

Welches ist nicht das gleiche Datumsformat wie das obige. –

13

Überprüfen Sie das Joda Time Paket. Sie erleichtern die RFC 3339-Datumsformatierung erheblich.

Joda Beispiel:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC); 
DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); 
String outRfc = fmt.print(dt); 
+2

Diese Antwort wäre eigentlich nützlich mit einem Beispiel. – noah

+1

@Biff Sie können Ihr Codebeispiel vereinfachen. Kein Formatierer erforderlich. Joda-Time verwendet standardmäßig das Format [ISO 8601] (https://en.wikipedia.org/wiki/ISO_8601)/[RFC 3339] (http://www.ietf.org/rfc/rfc3339.txt). Rufen Sie die Methode 'toString' explizit oder implizit auf. So, 'String output = dt.toString();' –

4

Das Problem ist, dass die Zeitzone Z ohne Doppelpunkt (:) als Trenn Offset erzeugt.

+0

Absolut richtig, aber sagt uns nicht, wie es zu beheben ist. Die Lösung von jjohn hat es für mich repariert. – scaganoff

11

Von der "get it done dept", eine Lösung ist es, Regexes zu verwenden, um die Zeichenfolge zu beheben, nachdem SimpleDateFormat abgeschlossen wurde. Etwas wie s/(\ d {2}) (\ d {2}) $/$ 1: $ 2/in Perl.

Wenn Sie nur im Entferntesten daran interessiert sind, werde ich diese Antwort mit dem funktionierenden Java-Code bearbeiten.

Aber ja. Ich treffe dieses Problem auch. RFC3339, ich schaue dich an!

EDIT:

Dies funktioniert für mich

// As a private class member 
private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 

String toRFC3339(Date d) 
{ 
    return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2"); 
} 
1

fand ich ein Streu Pastebin, die mich mit dem Thema geholfen: http://pastebin.com/y3TCAikc

gerade seinen Inhalt später gelöscht werden, falls:

// I want 2008-11-13T12:23:30-08:00 
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").format(new Date()); 
System.out.println(timestamp); 
// prints "2008-11-13T12:23:30-0800" See the difference? 

// Throws a ParseException 
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00") 

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ"); 
0

Ich machte eine InternetDateFormat Klasse für RFC33 39.

Aber Quellcode-Kommentar ist Japanisch.

PS: Ich erstellte englische Ausgabe und Refactoring ein wenig.

9

ich auf der Suche ziemlich viel Zeit damit verbracht, eine Antwort auf die gleiche Frage und ich fand hier etwas: http://developer.android.com/reference/java/text/SimpleDateFormat.html

Vorgeschlagene Antwort :

String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());

Wenn Sie bemerken, dass ich 5 'Z' anstelle von einem verwende. Dies gibt die Ausgabe mit einem Doppelpunkt im Offset wie folgt: "2008-11-13T12: 23: 30-08: 00". Ich hoffe es hilft.

+0

Danke - Ihre Antwort ist unterbewertet - das ist es, was mir schließlich erlaubt, RFC 3339 auszugeben. Verwendung von X gab mir 'verursacht durch: java.lang.IllegalArgumentException: Illegal Musterkomponente: XXX \t bei org.apache.commons.lang.time .FastDateFormat.parsePattern (FastDateFormat.java:691) \t bei org.apache.commons.lang.time.FastDateFormat.init (FastDateFormat.java:558) ' – Zasz

+0

glücklich zu helfen :) –