tl; dr
myUtilDate.toInstant() // Convert `java.util.Date` to `Instant`.
.atOffset( ZoneOffset.UTC ) // Transform `Instant` to `OffsetDateTime`.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a String.
.replace( "T" , " " ) // Put a SPACE in the middle.
14.11.2014 14:05:09
java.time
Współczesnym sposobem są klasy java.time, które teraz zastępują kłopotliwe, stare, klasowe klasy data-godzina.
Najpierw przekonwertuj java.util.Date
na Instant
. Instant
Klasa reprezentuje moment na osi czasu w UTC o rozdzielczości nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).
Konwersje do / z java.time są wykonywane nowymi metodami dodanymi do starych klas.
Instant instant = myUtilDate.toInstant();
Zarówno twój, jak java.util.Date
i java.time.Instant
są w UTC . Jeśli chcesz zobaczyć datę i godzinę jako UTC, niech tak będzie. Wywołanie w toString
celu wygenerowania ciągu znaków w standardowym formacie ISO 8601 .
String output = instant.toString();
2014-11-14T14: 05: 09Z
W przypadku innych formatów musisz zmienić Instant
je w bardziej elastyczne OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2020-05-01T21: 25: 35.957Z
Zobacz, jak kod działa na żywo na IdeOne.com .
Aby uzyskać ciąg w żądanym formacie, określ DateTimeFormatter
. Możesz określić niestandardowy format. Ale użyłbym jednego z predefiniowanych formatów ( ISO_LOCAL_DATE_TIME
) i zamieniłem T
jego wynik na SPACJĘ.
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
14.11.2014 14:05:09
Nawiasem mówiąc, nie polecam tego rodzaju formatu, w którym celowo tracisz informacje o przesunięciu względem UTC lub strefie czasowej. Powoduje niejednoznaczność co do znaczenia wartości daty i godziny tego ciągu.
Uważaj również na utratę danych, ponieważ każda ułamkowa sekunda jest ignorowana (skutecznie obcinana) w reprezentacji ciągu znaków wartości daty i godziny.
Aby zobaczyć ten sam moment przez soczewkę zegara ściennego z określonego regionu , zastosuj a, ZoneId
aby uzyskać ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [America / Montreal]
Aby wygenerować sformatowany ciąg, tak samo jak powyżej, ale zastąpić odt
z zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
14.11.2014 14:05:09
Wykonując ten kod bardzo wiele razy, możesz być nieco bardziej wydajny i unikać połączeń z String::replace
. Porzucenie tego połączenia powoduje również skrócenie kodu. W razie potrzeby określ własny wzorzec formatowania we własnym DateTimeFormatter
obiekcie. Buforuj tę instancję jako stałą lub element członkowski do ponownego użycia.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Zastosuj ten formatyzator, przekazując instancję.
String output = zdt.format( f );
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te wyprzeć kłopotliwe starych klas Date-Time, takich jak java.util.Date
, .Calendar
, ijava.text.SimpleDateFormat
.
Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do java.time.
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień.
Duża część funkcji java.time została przeniesiona z powrotem do Java 6 i 7 w ThreeTen-Backport, a następnie dostosowana do Androida w ThreeTenABP (zobacz Jak korzystać… ).
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time.