tl; dr
Instant.now() // Capture the current moment in UTC.
Wygeneruj ciąg reprezentujący tę wartość:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Detale
Jak podała poprawna odpowiedź Jona Skeeta , obiekt java.util.Date nie ma strefy czasowej † . Ale jego toString
implementacja stosuje domyślną strefę czasową maszyny JVM podczas generowania ciągu reprezentującego tę wartość daty i godziny. Mylące dla naiwnego programisty data wydaje się mieć strefę czasową, ale jej nie ma.
Te java.util.Date
, j.u.Calendar
oraz java.text.SimpleDateFormat
zajęcia wiązane z Java są notorycznie kłopotliwe. Unikaj ich. Zamiast tego użyj jednej z tych kompetentnych bibliotek daty i godziny:
java.time (Java 8)
Java 8 oferuje doskonały nowy pakiet java.time. *, Który zastępuje stare klasy java.util.Date/Calendar.
Uzyskiwanie aktualnego czasu w UTC / GMT jest prostym linkiem…
Instant instant = Instant.now();
Ta Instant
klasa jest podstawowym elementem składowym java.time, reprezentującym moment na osi czasu w UTC z rozdzielczością nanosekund .
W Javie 8 bieżący moment jest rejestrowany z rozdzielczością do milisekund. Java 9 przynosi świeży realizacji ma wśród Clock
oddaje obecną chwilę w górę do pełnej zdolności nanosekundy tej klasy, w zależności od możliwości sprzętu zegara komputera hosta.
Ta toString
metoda generuje ciąg reprezentujący jego wartość przy użyciu jednego określonego formatu ISO 8601 . Ten format generuje cyfry zero, trzy, sześć lub dziewięć cyfr ( milisekund , mikrosekund lub nanosekund ), jeśli jest to konieczne do przedstawienia ułamka sekundy.
Jeśli chcesz bardziej elastycznego formatowania lub innych dodatkowych funkcji, zastosuj przesunięcie względem UTC równe zero, aby sam UTC ( ZoneOffset.UTC
stały ) uzyskał wartość OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Zrzut do konsoli…
System.out.println( "now.toString(): " + now );
Po uruchomieniu…
now.toString(): 2014-01-21T23:42:03.522Z
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
, i SimpleDateFormat
.
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 .
Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
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 .
Joda-Time
AKTUALIZACJA: Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Korzystając z darmowej biblioteki open source firmy Joda-Time innej firmy, możesz uzyskać bieżącą datę i godzinę w jednym wierszu kodu.
Joda-Time zainspirował nowe klasy java.time. * W Javie 8, ale ma inną architekturę. Możesz używać Joda-Time w starszych wersjach Javy. Joda-Time nadal działa w Javie 8 i jest aktywnie utrzymywany (od 2014). Jednak zespół Joda-Time zaleca migrację do java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Bardziej szczegółowy przykładowy kod (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Zrzut do konsoli…
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Po uruchomieniu…
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Aby zobaczyć więcej przykładowego kodu wykonującego pracę w strefie czasowej, zobacz moją odpowiedź na podobne pytanie.
Strefa czasowa
Zalecam, aby zawsze określać strefę czasową, zamiast domyślnie polegać na bieżącej domyślnej strefie czasowej JVM (która może ulec zmianie w dowolnym momencie!). Takie poleganie wydaje się być częstą przyczyną zamieszania i błędów w pracy z datą.
Podczas dzwonienia now()
należy podać żądaną / oczekiwaną strefę czasową do przypisania. Skorzystaj z DateTimeZone
klasy.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Klasa ta utrzymuje stałą dla strefy czasowej UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Jeśli naprawdę chcesz użyć bieżącej domyślnej strefy czasowej maszyny JVM, wykonaj jawne wywołanie, aby kod sam się dokumentował.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Przeczytaj o formatach ISO 8601 . Zarówno java.time, jak i Joda-Time używają rozsądnych formatów tego standardu jako domyślnych dla parsowania i generowania ciągów.
† Właściwie tak, java.util.Date tak posiada strefę czasową, zakopane głęboko pod warstwami kodu źródłowego. Dla większości praktycznych celów ta strefa czasowa jest ignorowana. Tak więc, jak stenografia, mówimy java.util.Date nie ma strefy czasowej. Co więcej, ta zakopana strefa czasowa nie jest tą, którą stosuje toString
metoda Date ; ta metoda używa bieżącej domyślnej strefy czasowej maszyny JVM. Tym bardziej należy unikać tej mylącej klasy i trzymać się Joda-Time i java.time.