tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Poznaj swoje dane
Ludzie używają różnych dokładności w śledzeniu czasu jako liczby od epoki . Więc kiedy otrzymasz kilka liczb, które mają być zinterpretowane jako liczba od epoki, musisz określić:
- Jakiej epoki?
W różnych systemach używano dat z wielu epok . Powszechnie używany jest czas POSIX / Unix , gdzie epoka to pierwsza chwila 1970 roku w UTC. Ale nie powinieneś zakładać tej epoki.
- Jaka precyzja?
Czy mówimy o sekundach, milisekundach , mikrosekundach czy nanosekundach od epoki?
- W jakiej strefie czasowej?
Zwykle licznik, ponieważ epoka jest w strefie czasowej UTC / GMT, to znaczy w ogóle nie ma przesunięcia strefy czasowej. Ale czasami, gdy angażujemy niedoświadczonych lub nie znających się na czasie programistów, może istnieć domniemana strefa czasowa.
W twoim przypadku, jak zauważyli inni, wydaje się, że od ery Uniksa dano ci kilka sekund. Ale przekazujesz te sekundy konstruktorowi, który oczekuje milisekund. Więc rozwiązaniem jest pomnożenie przez 1000.
Zdobyta wiedza:
- Określ, nie zakładaj, znaczenie otrzymanych danych.
- Przeczytaj dokument .
Twoje dane
Twoje dane wydają się być w całych sekundach. Jeśli przyjmiemy epokę początku 1970 roku i przyjmiemy strefę czasową UTC, to 1,220,227,200
jest to pierwsza chwila pierwszego dnia września 2008 roku.
Joda-Time
Klasy java.util.Date i .Calendar dołączone do języka Java są notorycznie kłopotliwe. Unikaj ich. Zamiast tego użyj biblioteki Joda-Time lub nowego pakietu java.time dołączonego do języka Java 8 (i zainspirowanego Joda-Time).
Zauważ, że w przeciwieństwie do juDate, a DateTime
w Joda-Time naprawdę zna swoją przypisaną strefę czasową . W poniższym przykładzie kodu Joda-Time 2.4 zauważ, że najpierw analizujemy milisekundy przy użyciu domyślnego założenia UTC. Następnie, po drugie, przypisujemy strefę czasową Paryża do dostosowania. Ten sam moment na osi czasu Wszechświata, ale inny zegar ścienny . W celach demonstracyjnych ponownie dostosowujemy się do UTC. Prawie zawsze lepiej jest jawnie określić żądaną / oczekiwaną strefę czasową niż polegać na domyślnej wartości domyślnej (często jest to przyczyna problemów w pracy z datą i godziną).
Potrzebujemy milisekund, aby skonstruować DateTime. Więc weź sekundy i pomnóż przez tysiąc. Zauważ, że wynik musi być 64-bitowy, long
ponieważ przepełnilibyśmy 32-bitowy int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Podaj tę liczbę milisekund do konstruktora. Ten konkretny konstruktor zakłada, że licznik pochodzi z uniksowej epoki 1970. Po zakończeniu konstrukcji dostosuj strefę czasową według potrzeb.
Użyj prawidłowych nazw stref czasowych , kombinacji kontynentu i miasta / regionu. Nigdy nie używaj kodów 3- lub 4-literowych, EST
ponieważ nie są one ani znormalizowane, ani unikalne.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
W celu demonstracji ponownie ustaw strefę czasową.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Zrzuć na konsolę. Zwróć uwagę, jak różni się data w Montrealu, ponieważ nowy dzień zaczął się w Europie, ale jeszcze nie w Ameryce.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Po uruchomieniu.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Twórcy Joda-Time poprosili nas o migrację do jego zamiennika, frameworka java.time , tak szybko, jak będzie to wygodne. Chociaż Joda-Time jest nadal aktywnie wspierana, cały przyszły rozwój będzie się odbywał na klasach java.time i ich rozszerzeniach w projekcie ThreeTen-Extra.
Struktura czasu Java jest zdefiniowana przez JSR 310 i wbudowana w Javę 8 i nowszą. Klasy java.time zostały ponownie przeniesione do Javy 6 i 7 w projekcie ThreeTen-Backport oraz do systemu Android w projekcie ThreeTenABP .
Na Instant
osi czasu znajduje się moment w UTC z rozdzielczością nanosekund. Jego epoka to pierwszy moment 1970 roku w UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Zastosuj przesunięcie od UTC, ZoneOffset
aby uzyskać plik OffsetDateTime
.
Jeszcze lepiej, jeśli jest znana, zastosuj strefę czasową, ZoneId
aby uzyskać ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );