tl; dr
Instant.ofEpochSecond(1_220_227_200L)
conoscere i Suoi dati
Le persone usano diverse precisioni nel monitoraggio di tempo come un numero in quanto un epoch. Così, quando si ottiene alcuni numeri da interpretare come un conteggio in quanto un'epoca, è necessario determinare:
- quale epoca?
Many epochs dates sono stati utilizzati in vari sistemi. Comunemente utilizzato è POSIX/Unix time, dove l'epoca è il primo momento del 1970 in UTC. Ma non dovresti assumere questa epoca.
- Che precisione?
Stiamo parlando di secondi, milliseconds, microseconds o nanoseconds dall'epoca?
- Che fuso orario?
Generalmente un conteggio poiché l'epoca è nel fuso orario UTC/GMT, ovvero non ha alcun offset del fuso orario. Ma a volte, quando coinvolgono programmatori ignoranti inesperti o con data e ora, potrebbe esserci un fuso orario implicito.
Nel tuo caso, come altri hanno notato, sembra che ti siano stati dati dei secondi dall'epoca Unix. Ma stai passando quei secondi a un costruttore che si aspetta millisecondi. Quindi la soluzione è moltiplicare per 1.000.
Lezioni apprese:
- Determinare, non date per scontato, il significato dei dati ricevuti.
- Leggi the doc.
vostri dati
I dati sembra essere in secondi interi. Se assumiamo un'epoca dell'inizio del 1970, e se assumiamo UTC fuso orario, quindi 1,220,227,200
è il primo momento del primo giorno del mese di settembre 2008.
Joda Time
Il java.util.Date e le classi .Calendar in bundle con Java sono notoriamente fastidiose. Evitalo.Utilizzare invece la libreria Joda-Time o il nuovo java.time package in bundle in Java 8 (e ispirato a Joda-Time).
Si noti che a differenza di j.u.Date, uno DateTime
in Joda-Time conosce veramente il proprio time zone assegnato. Quindi nell'esempio codice Joda-Time 2.4 visto di seguito, si noti che prima analizziamo i millisecondi usando l'assunto di default di UTC. Quindi, in secondo luogo, assegniamo un fuso orario di Parigi da regolare. Lo stesso momento nella linea temporale dell'universo, ma diverso wall-clock time. Per la dimostrazione, ci adeguiamo di nuovo, a UTC. Quasi sempre è meglio specificare esplicitamente il fuso orario desiderato/atteso piuttosto che fare affidamento su un default implicito (spesso causa di problemi nel lavoro di data-ora).
Abbiamo bisogno di millisecondi per costruire un DateTime. Prendi il tuo input di secondi e moltiplicalo per mille. Si noti che il risultato deve essere un long
a 64 bit poiché si verificherà un 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".
Feed quel conteggio di millisecondi al costruttore. Quel particolare costruttore presuppone che il conteggio sia dell'epoca Unix del 1970. Quindi regolare il fuso orario come desiderato, dopo la costruzione.
Utilizzare i nomi proper time zone, una combinazione di continente e città/regione. Non utilizzare mai codici a 3 o 4 lettere come EST
poiché non sono né standardizzati né unici.
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"));
Discarica per consolle. 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 eseguito.
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 verso la sua sostituzione, il quadro java.time non appena è conveniente. Mentre Joda-Time continua a essere attivamente supportato, tutto lo sviluppo futuro sarà fatto sulle classi java.time e sulle loro estensioni nel progetto ThreeTen-Extra.
Il framework java-time è definito da JSR 310 e incorporato in Java 8 e versioni successive. Le classi java.time sono state sottoposte a back-porting su Java 6 & 7 sul 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);
Applicare un offset-from-UTCZoneOffset
per ottenere un OffsetDateTime
.
Meglio ancora, se noto, applicare un fuso orario ZoneId
per ottenere un ZonedDateTime
.
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId);
Puoi dire quali valori ti aspetti? La domanda di secondi/millisecondi può essere valida, ma 1220227200 non è 1/1/1970.Sembra che tu stia passando 0 al costruttore. Qualche altro codice potrebbe aiutare. – SJuan76
@mmmiki - dovresti accettare una risposta – Stewart
restituisce il 15 gennaio 1970, qui, non il primo gennaio. – njzk2