2013-10-01 38 views
73

Mam konstruktora SimpleDateFormat jakJava SimpleDateFormat ("yyyy-MM-dd'T'GG: mm: ss'Z '") daje czasową jako IST

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 

a ja parsowania ciąg "2013-09-29T18:46:19Z".

Przeczytałem, że tutaj Z oznacza strefę czasową GMT/UTC. ale kiedy wydrukuję tę datę na konsoli, It drukuje IST timezne dla zwróconej daty.

Teraz moje pytanie brzmi, czy moja produkcja jest dobra czy zła?

+2

tak, że to, co oznacza 'Z'. Z- Strefa czasowa – Woody

+0

Z = czas Zulu => GMT + 0, najwyraźniej nie służyłeś swojemu krajowi;) – MushyPeas

Odpowiedz

124

pan nie tylko ustawić strefę czasową dodał Z do końca datę/czas, więc to będzie wyglądać datę/czas GMT, ale to nie robi nie zmieni wartości.

Ustaw strefę czasową na GMT i będzie to poprawne.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
+2

Jeśli masz datę, powiedzmy 2012-12-06T06: 00: 00 bez Z, czy to oznacza GMT? – binarygiant

+2

@binarygiant Musiałbyś zapytać tych, którzy go wysłali. Może to być czas lokalny nadawcy. –

+2

Strefę czasową można ustawić na "UTC" – Prashanth

55

'T' i 'Z' są tutaj traktowane jako stałe. Musisz zdać Z bez cudzysłowów. Ponadto musisz określić strefę czasową w łańcuchu wejściowym.

Przykład: 2013-09-29T18:46:19-0700 i format jak "yyyy-MM-dd'T'HH:mm:ssZ"

+0

Subir, Dzięki za twoją odpowiedź, ale co to jest "0700" dodana do ciągu wejściowego ?? –

+0

'-0700' to strefa czasowa, tj. -7: 00 godz. –

+4

dla -07: 00 godz. I nie -0700 będzie następująca: rrrr-MM-dd'T'HH: mm: ss.SSSXXX – Tastybrownies

23

Od ISO 8601 String Java Data Object

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013 

jeśli nie ustawisz TimeZone.getTimeZone("GMT") to będzie wyjście Sun Sep 29 18:46:19 CST 2013

z Java Data Object ISO 8601 String

I przekonwertować Date obiekt ISO 8601 Standard (yyyy-MM-dd'T'HH:mm:ss'Z') użyć poniższy kod

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));   
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z 

Należy również pamiętać, że bez ' ' na Z yyyy-MM-dd'T'HH:mm:ssZ drukuje 2015-01-22T03:41:02+0000

26

jeśli chcesz obsługiwać „standard” JSON reprezentacji Data wtedy lepiej użyć ten wzór: "yyyy-MM-dd'T'HH:mm:ssX".

Zwróć uwagę na X na końcu. It will handle timezones in ISO 8601 standard oraz ISO 8601 jest dokładnie to, co wywołuje to oświadczenie w JavaScripcie new Date().toJSON()

Porównując do innych odpowiedzi to ma pewne zalety:

  1. Nie trzeba wymagać od swoich klientów, aby wysłać datę w GMT
  2. Nie musisz jawnie konwertować obiektu Date na GMT, używając: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+0

Używam automatycznego łączenia formularzy "play" i używam adnotacji "@ Format.DateTime". Użyj domyślnego wzoru z końcówką "Z" na końcu wydaje się niepoprawne. Po zmianie na 'X' działa. Wielkie dzięki – transang

+0

Jeśli twoja data określa strefę czasową w stylu zgodnym z RFC822, takim jak "-0500", działa to dobrze. Ale na randkę taką jak "2013-07-15T10: 22: 17-05: 00" (również ważna norma ISO8601 TZ) to się psuje. W takim przypadku musisz użyć "yyyy-MM-dd'T'HH: mm: ssXXX". – Lambart

7

Pozostałe odpowiedzi są przestarzałe od wersji Java 8.

ISO 8601

Twój format string dzieje zgodne ze standardem ISO 8601. Ten standard definiuje sensowne formaty reprezentujące różne wartości daty i czasu jako tekst.

java.time

Stare java.util.Date/.Calendar i java.text.SimpleDateFormat zajęcia zostały wyparte przez ramy java.time wbudowany w Java 8 i późniejszych. Zobacz Tutorial. Unikaj starych klas, ponieważ okazały się one źle zaprojektowane, mylące i kłopotliwe.

Część złego projektu w starych klasach cię ugryzła, gdzie metoda toString stosuje bieżącą domyślną strefę czasową JVM podczas generowania tekstowej reprezentacji wartości daty i czasu, która faktycznie jest w UTC (GMT); zamyślony, ale mylący.

Klasy java.time używają domyślnie formatów ISO 8601 podczas analizowania/generowania tekstowych reprezentacji wartości daty i godziny. Więc nie trzeba określać wzorca parsowania.

An Instant to moment na osi czasu w UTC.

Instant instant = Instant.parse("2013-09-29T18:46:19Z"); 

można zastosować time zone ile potrzeba do wytworzenia ZonedDateTime obiekt.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 
3

a jeśli nie ma opcji, aby przejść na java8 lepiej wykorzystywać „rrrr-mm-dd'T'GG: mm: SSX XX”, jak to zostanie poprawnie ponownie analizowany (jednocześnie z tylko jeden X to nie może być przypadek ... w zależności od funkcji analizowania)

X generuje: +01

XXX generuje: +01: 00