Oto odpowiedź na 2017 rok. Jeśli istnieje jakikolwiek sposób, który możesz (który jest), wyrzuć nieaktualne klasy, takie jak SimpleDateFormat
za burtę, i korzystaj z nowoczesnych i wygodniejszych zajęć w java.time
. W szczególności żądanym formacie 2012-11-25T23:50:56.193+01:00
zgodny z ISO 8601, a więc wychodzi z pudełka z nowszych klas, wystarczy użyć OffsetDateTime.toString()
:
OffsetDateTime time = OffsetDateTime.now();
System.out.println(time.toString());
Drukuje coś
2017-05-10T16:14:20.407+02:00
jedna rzecz może, ale nie musi, być świadomym, jednak drukuje tyle grup po 3 miejsc po przecinku, ile sekund zajmuje wydrukowanie precyzji w obiekcie OffsetDateTime
. Najwyraźniej na moim komputerze "teraz" pochodzi z dokładnością do milisekund (sekundy z trzema miejscami dziesiętnymi).
Jeśli masz staroświecki obiekt Date
, na przykład, masz go z połączenia z pewną starszą metodą, polecam pierwszą rzeczą, którą zrobisz, jest przekonwertowanie go na Instant
, która jest jedną z nowoczesnych klas. Z tego miejsca możesz z łatwością dokonywać innych konwersji w zależności od wymagań:
Date now = new Date();
OffsetDateTime time = now.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime();
System.out.println(time.toString());
Naprawdę generuję więcej konwersji niż to konieczne. atZone(ZoneId.systemDefault())
wyprodukowała ZonedDateTime
, a jego toString()
nie zawsze da ci format, o którym mówisz, że chciałeś; ale można go łatwo sformatować:
ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault());
System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
Czy jest sposób dla starszych javas bez jody? – Karussell
Zobacz: http://stackoverflow.com/questions/13040143/generic-support-for-iso-8601-format-in-java-6 –
Uważam, że format jest z "HH", np. Rrrr-MM-dd'T "HH: mm: ss.SSSXXX; ponieważ "hh" wytworzy 00-12, a "HH" 00-23. Również z innego pytania związanego z SO. – Leo