tl; dr
Instant.ofEpochMilli(170_798_400_000L)
1975-05-31T20: 00: 00Z
... e ...
Instant.ofEpochMilli(170_798_400_000L)
.atZone(ZoneId.of("Europe/Moscow"))
1975-05-31T23: 00 + 03: 00 [Europa/Mosca]
Vedi live code.
Utilizzando java.time
L'approccio moderno utilizza le classi java.time in Java 8 e versioni successive.
Si stanno utilizzando classi fastidiose di data e ora in Java che ora sono legacy. Tra i molti problemi su quelle classi c'era la ben intenzionata, ma confusa, caratteristica del metodo Date::toString
che applicava il fuso orario predefinito corrente durante la generazione della stringa. Il valore interno è in realtà sempre in UTC, ma l'toString
crea l'illusione che lo Date
abbia un fuso orario quando in realtà non lo è. Questo spiega il tuo mistero MSK
.
[Ancora più confuso, in realtà è un fuso orario sepolto in profondità Date
ma è irrilevante a questa discussione. Quelle vecchie classi Date
/Calendar
sono un pasticcio terribile. Fortunatamente Java ora dispone della migliore struttura data-ora su qualsiasi piattaforma: java.time.]
Apparentemente l'input rappresenta il numero di millisecondi dall'epoca Unix di 1970-01-01T00: 00: 00Z.
La classe Instant
rappresenta un momento sulla timeline in UTC con una risoluzione di nanoseconds (fino a nove (9) cifre di una frazione decimale). Questa classe può analizzare direttamente il tuo numero di input.
Instant instant = Instant.ofEpochMilli(170_798_400_000L) ;
instant.toString(): 1975-05-31T20: 00: 00Z
Se volete vedere quello stesso momento attraverso la lente di una particolare regione del wall-clock time, applicare un tempo zona.Applicare uno ZoneId
per ottenere un oggetto ZonedDateTime
.
ZoneId z = ZoneId.of("Europe/Moscow") ;
ZonedDateTime zdt = instant.atZone(z) ;
1975-05-31T23: 00 + 03: 00 [Europa/Mosca]
libreria JavaScript è corretto
I risultati della chiamata al libreria JavaScript è errato con il suo offset di +04: 00. According to Wikipedia, l'ora di Mosca dal 1930 al 1981 era tre ore avanti, +03: 00. Il framework java.time restituisce risultati corretti di +03: 00 per tutto l'anno del 1975. Vedi Time in Russia per maggiori informazioni. Avvertenza: non sono esperto in Russia/tempo sovietico.
Chi java.time
Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data legacy come java.util.Date
, Calendar
, & SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.
Dove ottenere le classi java.time?
- Java SE 8, Java SE 9, e più tardi
- incorporato.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- Java SE 6 e Java SE 7
- Molte delle funzionalità java.time è di back-porting per Java 6 .
- Android
Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e more.
Forse questo ha qualcosa a che fare con "Fusi orari cambia": http://en.wikipedia.org/wiki/Moscow_Time –
Lo è sicuramente. Ciò significa che il costruttore Date non può più essere utilizzato in javascript? – ike3
Beh, se uno di questi sta dando la risposta giusta, ma non l'altro, allora direi che l'altro ha un bug :-) Java è corretto o è JavaScript? Mi aspetterei che la versione Java dia la risposta giusta, ma questo è solo un sospetto. – Pointy