tl; dr
Instant.ofEpochMilli( 1_322_018_752_992L ) // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.
Detale
Inne odpowiedzi używają przestarzałych lub niepoprawnych klas.
Unikaj starych klas daty i godziny, takich jak java.util.Date/.Calendar. Okazały się źle zaprojektowane, zagmatwane i kłopotliwe.
java.time
Java.time ramy przychodzi wbudowany w Java 8 i późniejszych. Wiele funkcji zostało przeniesionych do Java 6 i 7 i dodatkowo dostosowanych do systemu Android . Wykonane przez tych samych ludzi, którzy stworzyli Joda-Time .
Jest Instant
moment na osi czasu w UTC z rozdzielczością nanosekund . Jego epoka to pierwszy moment 1970 roku w UTC.
Zakładając, że dane wejściowe są liczbą milisekund od 1970-01-01T00: 00: 00Z (nie jest jasne w pytaniu), możemy łatwo utworzyć instancję Instant
.
Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
instant.toString (): 2011-11-23T03: 25: 52.992Z
W Z
tym standardzie ciąg w formacie ISO 8601 jest skrótem od Zulu
i oznacza UTC .
Zastosuj strefę czasową, używając odpowiedniej nazwy strefy czasowej , aby uzyskać ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );
Zobacz, jak działa ten kod na IdeOne.com .
Asia/Kolkata
strefa czasowa ?
Domyślam się, że strefa czasowa Indii wpływa na Twój kod. Widzimy tutaj, że dostosowanie do Asia/Kolkata
strefy czasowej powoduje renderowanie tej samej pory dnia, co zgłaszasz, 08:55
czyli pięć i pół godziny przed naszą wartością UTC 03:25
.
2011-11-23T08: 55: 52.992 + 05: 30 [Azja / Kalkuta]
Strefa domyślna
Możesz zastosować bieżącą domyślną strefę czasową maszyny JVM. Pamiętaj, że wartość domyślna może się zmienić w dowolnym momencie podczas działania . Dowolny kod w dowolnym wątku dowolnej aplikacji w JVM może zmienić bieżącą wartość domyślną. Jeśli to ważne, zapytaj użytkownika o żądaną / oczekiwaną strefę czasową.
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, i SimpleDateFormat
.
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Korzystając ze sterownika JDBC zgodnego z JDBC 4.2 lub nowszym, możesz wymieniać obiekty java.time bezpośrednio z bazą danych. Nie ma potrzeby używania ciągów znaków ani klas java.sql. *.
Skąd wziąć klasy java.time?
- Java SE 8 , Java SE 9 i nowsze
- Wbudowany.
- Część standardowego interfejsu API języka Java z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i Java SE 7
- Android
- Późniejsze wersje implementacji klas java.time w pakietach Androida.
- Na wcześniejszym Androidzie ThreeTenABP projekt dostosowuje ThreeTen-backportu (wymienione powyżej). Zobacz Jak używać ThreeTenABP… .
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 .