Jaki jest najbardziej elegancki sposób uzyskania aktualnego momentu w formacie ISO 8601 , UTC? Powinno to wyglądać tak: 2010-10-12T08:50Z
.
Przykład:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
Jaki jest najbardziej elegancki sposób uzyskania aktualnego momentu w formacie ISO 8601 , UTC? Powinno to wyglądać tak: 2010-10-12T08:50Z
.
Przykład:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
private static SimpleDateFormat
nie jest bezpieczne dla wątków.Odpowiedzi:
Służy
SimpleDateFormat
do formatowania dowolnegoDate
obiektu:Użycie przycisku
new Date()
jak pokazano powyżej spowoduje sformatowanie bieżącej godziny.źródło
"yyyy-MM-dd'T'HH:mmZ"
w mojej aplikacji, za każdym razem, gdy potrzebuję daty w formacie ISO-8601. Z JodaTime, jak widzę, mogę użyć wstępnie zdefiniowanego formatyzatoraISODateTimeFormat
, który wykonuje tę pracę za mnie ..Z
jest prawidłowy wzór w SimpleDateFormat, raczej to zrobić:yyyy-MM-dd'T'HH:mm'Z'
.W systemach, w których domyślną strefą czasową nie jest UTC:
The
SimpleDateFormat
razie potrzeby instancję można zadeklarować jako stałą globalną, ale należy pamiętać, że ta klasa nie jest bezpieczna dla wątków. Musi być zsynchronizowany, jeśli dostęp do niego prowadzi jednocześnie przez wiele wątków.EDYCJA: Wolałbym Joda Time, jeśli
wykonuję wiele różnych manipulacji Times / Date ... EDIT2: poprawiony:
setTimeZone
nie akceptuje ciągu (poprawiony przez Paula)źródło
2016-06-14T13:56+0000
- pytamy o coś takiego2016-06-14T13:56Z
Java 8 Native
java.time sprawia, że jest to łatwe od Java 8. I wątek jest bezpieczny.
Wynik:
2015-04-14T11:07:36.639Z
Dostosowując lub łącząc opcje / operacje ZonedDateTime i DateTimeFormatter , możesz łatwo kontrolować strefę czasową i dokładność , do pewnego stopnia:
Wynik:
2015-04-14T11:07:00+01:00[Europe/Paris]
Ulepszone wymagania, takie jak usunięcie części sekund, muszą nadal być obsługiwane przez niestandardowe formaty lub niestandardowy proces post.
źródło
ZoneId.of( "America/Montreal" )
.return DateTimeFormatter.ISO_INSTANT.format(this);
DateTimeFormatter.ISO_INSTANT
iDateTimeFormatter.ISO_DATE_TIME
używam 6 cyfr po sekundach, w przeciwieństwie do 3, które nie są już odbierane przez Springa@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
.Java 8:
Przed Java 8:
Z dokumentów :
źródło
DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);
, albo kapsułkujeszreturn String.format("%tFT%<tRZ", new Date());
do klasy i róbstr = Iso8601Time.now()
, gdziekolwiek tego potrzebujesz. (To nie tak, że format ISO się zmieni.) Jeśli okaże się, że potrzebujesz czegoś więcej niż tylko bieżącej daty w formacie ISO, użyj lib.%tFT%<tTZ
będzie zawierać sekundy;%tFT%<tTZ.%<tL
obejmie milisekundy.Od wersji Java 8 możesz po prostu:
Z
java.time.Instant
dokumentów:źródło
SimpleDateFormats
.toString
, w wielu przypadkach nie trzeba nawet wyraźnie nazywać tego.użyj JodaTime
Tutaj dokument dla JodaTime Formatter
Edytować:
Jeśli nie chcesz dodawać lub nie widzisz wartości dodawania powyżej biblioteki, możesz po prostu użyć wbudowanej
SimpleDateFormat
klasy, aby sformatować datę na wymagany format ISOzgodnie z sugestią @Joachim Sauer
źródło
ISODateTimeFormat
- predefiniowany formatator ISO-8601.DateFormatUtils z Apache
commons-lang3
mają przydatne stałe, na przykład:DateFormatUtils.ISO_DATETIME_FORMAT
źródło
DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));
aktualny moment w domyślnej strefie czasowejDateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date())
:; @ yegor256 dzięki za wzmiankęDateFormatUtils
, mając na pokładzie apache commons-lang warto użyć formatu daty.Jeśli nie chcesz dołączać Jodatime (choć jest to tak miłe)
który zwraca ciąg:
co nieco różni się od pierwotnego żądania, ale nadal jest ISO-8601.
źródło
ISO 8601 może zawierać sekundy, patrz http://en.wikipedia.org/wiki/ISO_8601#Times
więc kod powinien być
źródło
Joda-Time
Aktualizacja: Projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . W przypadku Java 6 i 7 zobacz projekt ThreeTen-Backport , dodatkowo dostosowany do systemu Android w projekcie ThreeTenABP .
Korzystanie z biblioteki Joda-Time …
Jest to bezpieczne dla wątków. Joda-Time tworzy nowe niezmienne obiekty zamiast zmieniać istniejące.
Jeśli naprawdę chciałeś poprosić o format bez sekund, przeliczając na minuty, użyj jednego z wielu innych wbudowanych formatów w Joda-Time.
java.time
W przypadku Javy 8 i nowszych Joda-Time nadal działa. Ale wbudowany czas java.time framework zastępuje Joda-Time. Więc migruj swój kod z Joda-Time do java.time, gdy tylko będzie to wygodne.
Zobacz moje inne Odpowiedzi na nowoczesne rozwiązanie.
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Dla wersji Java 7
Możesz śledzić dokumentację Oracle: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X - jest używany dla strefy czasowej ISO 8601
źródło
Możesz użyć SimpleDateFormat Java z następującym wzorcem
yyyy-MM-dd'T'HH:mm:ssXXX
dla ISO 8601.Możesz użyć:
dla domyślnej strefy czasowej vm. Więcej tutaj
Możesz zauważyć datę i godzinę dla kilku stref czasowych, które się kończą
'Z'
. Te strefy czasowe mają przesunięcie względem'0'
GMT.Więcej informacji można znaleźć tutaj .
źródło
Wierzę, że najłatwiej jest najpierw przejść do instant, a następnie napisać:
Co spowoduje:
2017-09-08T12:56:45.331Z
źródło
Date
obiekt. Po prostu zróbInstant.now().toString()
. Jeśli masz starsząDate
wersję interfejsu API, Twoja metoda jest najlepsza.java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .tl; dr
Niektóre inne odpowiedzi są prawidłowe w polecaniu klas java.time , ale używają niepotrzebnych długości do konkretnych potrzeb.
Instant::toString
jav.time.Instant
Klasa reprezentuje moment w UTC, zawsze w UTC.Na
Z
końcu przykładowego łańcucha2010-10-12T08:50Z
jest wymawiane „Zulu” i oznacza UTC .Wybrany format jest zgodny z normą ISO 8601 . W java.time klas użyć tych standardowych formatów domyślnie podczas parsowania / generowania ciągów. Nie trzeba więc określać wzorca formatowania. Zadzwoń
Instant::toString
jak pokazano powyżej.Jeśli chcesz całe minuty bez sekundy lub ułamka sekundy, skróć. Określ jednostkę czasu za pomocą
ChronoUnit
klasy.O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te zastępują kłopotliwe starsze klasowe daty i godziny, takie jak
java.util.Date
:Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do java.timeklas .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Oto cała klasa zoptymalizowana tak, że wywołanie „now ()” nie robi nic więcej niż musi.
źródło
Instant
,DateTimeFormat
a drugi nowoczesny bezpieczny wątek zamiennikiźródło
Mimo to joda-time obsługuje tylko rozszerzony format: „2015-12-09T00: 22: 42.930Z”, a nie podstawowy: „20151209T002242.930Z” ... może lepiej byłoby przetestować listę formatów za pomocą Java SimpleDateFormat.
źródło
Zrobiłem to w Androidzie za pomocą Kalendarza i SimpleDateFormat. Poniższa metoda zwraca kalendarz z strefą czasową „GMT” (jest to uniwersalna strefa czasowa). Następnie możesz użyć klasy Calendar, aby ustawić godzinę między różnymi strefami czasowymi, używając metody setTimeZone () klasy Calendar.
PAMIĘTAJ: Klasa Date nie wie o istnieniu TimeZone. Z tego powodu, jeśli debugujesz jedną datę, zawsze widzisz datę swojej bieżącej strefy czasowej.
źródło
Jeśli zależy Ci na wydajności, stworzyłem bibliotekę, która przewyższa standardowy parser Java i formatator w manipulowaniu datami sformatowanymi w ISO8601. Implementacje DatetimeProcessor są bezpieczne dla wątków i mogą być buforowane w równoległej mapie lub polach statycznych.
źródło
Powinni byli dodać jakąś prostą metodę przejścia z Date na Instant, a także metodę o nazwie
toISO8601
, której szuka wielu ludzi. Jako uzupełnienie innych odpowiedzi, od java.util.Date do formatu ISO 8601:Nie jest to tak naprawdę widoczne przy korzystaniu z autouzupełniania, ale
java.time.Instant.toString()
:źródło
źródło
Spróbuj tego,
Jest w formacie ISO 8601
źródło