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/UTC
strefę 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?
java
date
timezone
date-format
simpledateformat
Pradip Borde
źródło
źródło
Odpowiedzi:
Nie ustawiłeś strefy czasowej tylko dodałeś a
Z
na 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.
źródło
'T'
i'Z'
są tutaj traktowane jako stałe. Musisz przejśćZ
bez 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"
źródło
-0700
to strefa czasowa tj. -7: 00 HrsOd ciągu ISO 8601 do obiektu Java Date
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ć
Date
obiekt na standard ISO 8601 (yyyy-MM-dd'T'HH:mm:ss'Z'
), użyj następującego koduNależy również pamiętać, że bez nadruków
' '
w Z.yyyy-MM-dd'T'HH:mm:ssZ
2015-01-22T03:41:02+0000
źródło
Jeśli chcesz obsługiwać „ standardowego ” JSON reprezentacji Data wtedy lepiej użyć tego wzoru:
"yyyy-MM-dd'T'HH:mm:ssX"
.Zwróć uwagę
X
na 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:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
źródło
play
automatycznego łączenia formularzy i używam@Format.DateTime
adnotacji. Użyj domyślnego wzoru zZ
końcówką, która wydaje się być niepoprawna. Po zmianie naX
działa. Wielkie dziękitl; dr
Pozostałe odpowiedzi są przestarzałe od wersji Java 8.
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
/.Calendar
ijava.text.SimpleDateFormat
został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
toString
metoda 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
Instant
osi czasu jest chwila w UTC .W razie potrzeby można zastosować strefę czasową do utworzenia
ZonedDateTime
obiektu.źródło
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
źródło
Dla Java 8: możesz użyć wbudowanego,
java.time.format.DateTimeFormatter
aby zmniejszyć ryzyko wystąpienia literówek, takich jakISO_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źródło