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.
Conosci i tuoi dati
Le persone usano varie precisioni nel tracciare il tempo come un numero da un'epoca . Quindi, quando ottieni dei numeri da interpretare come un conteggio da un'epoca, devi determinare:
- Quale epoca?
Molte epoche date sono state utilizzate in vari sistemi. Comunemente usato è il tempo POSIX / Unix , dove l'epoca è il primo momento del 1970 in UTC. Ma non dovresti dare per scontato quest'epoca.
- Quale precisione?
Stiamo parlando di secondi, millisecondi , microsecondi o nanosecondi dall'epoca?
- Quale fuso orario?
Di solito un conteggio poiché epoch è nel fuso orario UTC / GMT, cioè non ha alcun offset di fuso orario. Ma a volte, quando si coinvolgono programmatori inesperti o ignoranti di data e ora, potrebbe esserci un fuso orario implicito.
Nel tuo caso, come altri hanno notato, sembra che ti siano stati dati secondi dall'epoca di Unix. Ma stai passando quei secondi a un costruttore che si aspetta millisecondi. Quindi la soluzione è moltiplicare per 1.000.
Lezioni imparate:
- Determina, non dare per scontato, il significato dei dati ricevuti.
- Leggi il documento .
I tuoi dati
I tuoi dati sembrano essere in secondi interi. Se assumiamo un'epoca dell'inizio del 1970 e se assumiamo il fuso orario UTC, allora 1,220,227,200
è il primo momento del primo giorno di settembre 2008.
Joda-Time
Le classi java.util.Date e .Calendar in bundle con Java sono notoriamente problematiche. Evitali. Utilizza invece la libreria Joda-Time o il nuovo pacchetto java.time in bundle in Java 8 (e ispirato a Joda-Time).
Nota che a differenza di juDate, a DateTime
in Joda-Time conosce veramente il proprio fuso orario assegnato . Quindi, nell'esempio del codice Joda-Time 2.4 visto di seguito, nota che prima analizziamo i millisecondi utilizzando l'ipotesi predefinita di UTC. Quindi, in secondo luogo, assegniamo un fuso orario di Parigi da regolare. Stesso momento nella linea temporale dell'Universo, ma diverso tempo dell'orologio da parete . Per dimostrazione, ci adattiamo di nuovo, a UTC. Quasi sempre meglio specificare esplicitamente il fuso orario desiderato / previsto piuttosto che fare affidamento su un valore predefinito implicito (spesso causa di problemi nel lavoro data-ora).
Abbiamo bisogno di millisecondi per costruire un DateTime. Quindi prendi il tuo input di secondi e moltiplica per mille. Tieni presente che il risultato deve essere un 64 bit, long
poiché andremmo in overflow a 32 bit 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".
Fornisci quel conteggio di millisecondi al costruttore. Quel particolare costruttore presume che il conteggio sia dell'epoca Unix del 1970. Quindi regola il fuso orario come desideri, dopo la costruzione.
Utilizza nomi di fuso orario corretti , una combinazione di continente e città / regione. Non utilizzare mai codici di 3 o 4 lettere EST
come non sono né standardizzati né univoci.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Per la dimostrazione, regolare di nuovo il fuso orario.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Scarica su console. Nota come la data è diversa a Montréal, poiché il nuovo giorno è iniziato in Europa ma non ancora in America.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Quando corri.
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
I creatori di Joda-Time ci hanno chiesto di migrare al suo sostituto, il framework java.time non appena sarà conveniente. Sebbene Joda-Time continui ad essere attivamente supportato, tutto lo sviluppo futuro verrà effettuato sulle classi java.time e sulle loro estensioni nel progetto ThreeTen-Extra.
Il framework java-time è definito da JSR 310 e integrato in Java 8 e versioni successive. Le classi java.time sono state portate indietro su Java 6 e 7 nel progetto ThreeTen-Backport e su Android nel progetto ThreeTenABP .
Un Instant
è un momento sulla timeline in UTC con una risoluzione di nanosecondi. La sua epoca è il primo momento del 1970 in UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Applica un offset da UTC ZoneOffset
per ottenere un file OffsetDateTime
.
Meglio ancora, se noto, applica un fuso orario ZoneId
per ottenere un file ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );