Java SimpleDateFormat („yyyy-MM-dd'T'HH: mm: ss'Z '”) podaje strefę czasową jako IST


148

Mam konstruktora SimpleDateFormat jako

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

i analizuję ciąg "2013-09-29T18:46:19Z".

Czytałem, że tutaj Z reprezentuje GMT/UTCstrefę czasową. ale kiedy drukuję tę datę na konsoli, wyświetla czas IST dla zwróconej daty.

Teraz moje pytanie brzmi, czy mój wynik jest dobry, czy zły?


3
tak, to właśnie reprezentuje „Z”. Z- Strefa czasowa
Woody

5
Z = czas Zulu => GMT + 0, najwyraźniej nie
służyłeś

Odpowiedzi:


251

Nie ustawiłeś strefy czasowej tylko dodałeś a Zna końcu daty / godziny, więc będzie wyglądać jak data / czas GMT, ale to nie zmienia wartości.

Ustaw strefę czasową na GMT i będzie poprawna.

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

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

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

2
Strefę czasową można ustawić na „UTC”
Prashanth

2
Zamiast ustawiać strefę czasową w tak wielu miejscach dla różnych bibliotek i unikać konfliktów ze strefą czasową twojego komputera / laptopa, powinieneś zawsze ustawiać domyślną strefę czasową JVM, ustawiając właściwość systemową user.timezone: java -Duser.timezone = GMT ...
kisna

100

'T'i 'Z'są tutaj traktowane jako stałe. Musisz przejść Zbez cudzysłowów. Ponadto musisz określić strefę czasową w ciągu wejściowym.

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


Subir, Dziękuję za odpowiedź, ale co to jest „0700” dołączone do ciągu wejściowego?
Pradip Borde

-0700to strefa czasowa tj. -7: 00 Hrs
Subir Kumar Sao

12
dla godziny -07: 00, a nie -0700, wyglądałoby to następująco: yyyy-MM-dd'T'HH: mm: ss.SSSXXX
Tastybrownies

48

Od ciągu ISO 8601 do obiektu Java Date

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"), wyświetli sięSun Sep 29 18:46:19 CST 2013

Z obiektu Java Date do ciągu ISO 8601

Aby przekonwertować Dateobiekt na standard ISO 8601 ( yyyy-MM-dd'T'HH:mm:ss'Z'), użyj następującego kodu

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 nadruków ' 'w Z.yyyy-MM-dd'T'HH:mm:ssZ2015-01-22T03:41:02+0000


2
Daje mi java.text.ParseException: Unparseable date: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....

41

Jeśli chcesz obsługiwać „ standardowego ” JSON reprezentacji Data wtedy lepiej użyć tego wzoru: "yyyy-MM-dd'T'HH:mm:ssX".

Zwróć uwagę Xna koniec. Obsługuje strefy czasowe w standardzie ISO 8601 , a ISO 8601 jest dokładnie tym, co generuje to oświadczenie w JavaScriptnew Date().toJSON()

W porównaniu z innymi odpowiedziami ma kilka zalet:

  1. Nie musisz wymagać od swoich klientów, aby wysyłali datę w GMT
  2. Nie musisz jawnie konwertować obiektu Date na GMT za pomocą tego: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
Używam playautomatycznego łączenia formularzy i używam @Format.DateTimeadnotacji. Użyj domyślnego wzoru z Zkońcówką, która wydaje się być niepoprawna. Po zmianie na Xdziała. Wielkie dzięki
transang

Jeśli data określa strefę czasową w sposób zgodny ze standardem RFC822, np. „-0500”, działa to dobrze. Ale w przypadku daty takiej jak „2013-07-15T10: 22: 17-05: 00” (również poprawna ISO8601 TZ) to się psuje. W takim przypadku musisz użyć „yyyy-MM-dd'T'HH: mm: ssXXX”.
Lambart

23

tl; dr

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

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

ISO 8601

Format twojego ciągu jest zgodny ze standardem ISO 8601 . Ten standard definiuje rozsądne formaty do przedstawiania różnych wartości daty i czasu jako tekstu.

java.time

Stare klasy java.util.Date/ .Calendari java.text.SimpleDateFormatzostały zastąpione przez strukturę java.time wbudowaną w Javę 8 i nowszą. Zobacz samouczek . Unikaj starych klas, ponieważ okazały się źle zaprojektowane, zagmatwane i kłopotliwe.

Ugryzła Cię część kiepskiego projektu w starych klasach, gdzie toStringmetoda stosuje bieżącą domyślną strefę czasową maszyny JVM podczas generowania tekstowej reprezentacji wartości daty i czasu, która jest w rzeczywistości w czasie UTC (GMT); z dobrymi intencjami, ale mylące.

Klasy java.time używają domyślnie formatów ISO 8601 podczas analizowania / generowania tekstowych reprezentacji wartości daty i godziny. Nie ma więc potrzeby określania wzorca analizy.

Na Instantosi czasu jest chwila w UTC .

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

W razie potrzeby można zastosować strefę czasową do utworzenia ZonedDateTimeobiektu.

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

Tabela typów dat i godzin w Javie, zarówno nowoczesnych, jak i starszych


22

a jeśli nie masz opcji, aby przejść na java8, lepiej użyj 'yyyy-MM-dd'T'HH: mm: ssX XX ', ponieważ zostanie to ponownie poprawnie przeanalizowane (podczas gdy tylko z jednym X może to nie być. .. w zależności od używanej funkcji parsującej)

X generuje: +01

XXX generuje: +01: 00


0

Dla Java 8: możesz użyć wbudowanego, java.time.format.DateTimeFormatteraby zmniejszyć ryzyko wystąpienia literówek, takich jak

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME reprezentuje 2011-12-03T10:15:30+01:00[Europe/Paris]jeden z dołączonych standardowych formatów DateTime dostarczanych przez Oracle Link

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.