tl; dr
Instant.ofEpochMilli(170_798_400_000L)
1975-05-31T20: 00: 00Z
... i ...
Instant.ofEpochMilli(170_798_400_000L)
.atZone(ZoneId.of("Europe/Moscow"))
1975-05-31T23: 00 + 03: 00 [Europa/Moskwa]
Zobacz live code.
Korzystanie java.time
nowoczesne podejście zastosowano klasy java.time w Java 8 i późniejszych.
Używasz kłopotliwych starych klas daty i czasu na Javie, które są już starsze. Wśród wielu problemów na tych klasach była dobrze przemyślana, ale myląca cecha metody Date::toString
, która stosowała bieżącą domyślną strefę czasową podczas generowania ciągu znaków. Wewnętrzna wartość jest zawsze zawsze w UTC, ale toString
tworzy złudzenie, że Date
ma strefę czasową, podczas gdy w rzeczywistości tak się nie dzieje. To wyjaśnia tajemnicę MSK
.
[Jeszcze bardziej zagmatwany, w rzeczywistości jest strefa czasowa pochowana głęboko w Date
, ale nie ma znaczenia dla tej dyskusji. Te stare klasy są okropnym bałaganem. Na szczęście Java ma teraz najlepszą w swojej klasie strukturę czasu na dowolnej platformie: java.time.]
Najwyraźniej dane wejściowe reprezentują liczbę milisekund od czasów uniksowych 1970-01-01T00: 00: 00Z.
Klasa Instant
reprezentuje moment na osi czasu w UTC z rozdzielczością nanoseconds (do dziewięciu (9) cyfr ułamka dziesiętnego). Ta klasa może bezpośrednio analizować twój numer wejściowy.
Instant instant = Instant.ofEpochMilli(170_798_400_000L) ;
instant.toString(): 1975-05-31T20: 00: 00Z
Jeśli chcesz zobaczyć tej samej chwili przez pryzmat konkretnego regionu wall-clock time, stosuje się czas strefa.Zastosuj obiekt ZoneId
, aby uzyskać obiekt ZonedDateTime
.
ZoneId z = ZoneId.of("Europe/Moscow") ;
ZonedDateTime zdt = instant.atZone(z) ;
1975-05-31T23: 00 + 03: 00 [Europa/Moskwa]
JavaScript Biblioteka jest niepoprawne
Wyniki rozmowy do JavaScript Biblioteka jest niepoprawny z jego offsetem +04: 00. According to Wikipedia, Moskwa od 1930 do 1981 roku była trzy godziny do przodu, +03: 00. Ramy java.time dają poprawne wyniki +03: 00 przez cały rok 1975. Aby uzyskać więcej informacji, zobacz Time in Russia. Zastrzeżenie: Nie jestem ekspertem w Rosji/Związku Radzieckim.
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.
Gdzie można uzyskać lekcje java.time?
Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval
, YearWeek
, YearQuarter
i more.
Może to ma coś wspólnego ze "zmianami strefy czasowej": http://en.wikipedia.org/wiki/Moscow_Time –
To definitywnie jest. Czy to oznacza, że konstruktora daty nie można już używać w javascript? – ike3
Cóż, jeśli jedno z nich podaje właściwą odpowiedź, ale nie drugą, to powiedziałbym, że druga ma błąd :-) Czy Java jest poprawna czy jest JavaScript? Chciałbym oczekiwać, że wersja Java udzieli właściwej odpowiedzi, ale to tylko podejrzenie. – Pointy