Devo convertire un timestamp unix in un object data.
Ho provato questo:
java.util.Date time = new java.util.Date(timeStamp);
Il valore del timestamp è: 1280512800
La data dovrebbe essere “2010/07/30 – 22:30:00” (come ho capito da PHP), invece ricevo Thu Jan 15 23:11:56 IRST 1970
.
Come dovrebbe essere fatto?
Per 1280512800
, moltiplicare per 1000, poiché java si aspetta millisecondi:
java.util.Date time=new java.util.Date((long)timeStamp*1000);
Se hai già avuto millisecondi, solo il new java.util.Date((long)timeStamp);
Dalla documentazione :
Assegna un object Date e lo inizializza per rappresentare il numero specificato di millisecondi dal tempo base standard noto come “l’epoca”, ovvero 1 gennaio 1970, 00:00:00 GMT.
Questo è il modo giusto:
Date date = new Date (); date.setTime((long)unix_time*1000);
Java 8 ha introdotto una nuova API per lavorare con date e orari: il pacchetto java.time .
Con java.time puoi usare:
Date date = Date.from( Instant.ofEpochSecond( timeStamp ) );
Un Instant rappresenta un timestamp in Java 8. Con il metodo statico Date.from()
è ansible convertire un’istanza Instant
in un’istanza java.util.Date
.
Sembra che Calendar sia la nuova strada da percorrere:
Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp*1000); out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));
L’ultima riga è solo un esempio di come usarlo, questo dovrebbe essere stampato ad esempio “14.06.2012”.
Se hai usato System.currentTimeMillis () per salvare il Timestamp non hai bisogno della parte “* 1000”.
Se si dispone del timestamp in una stringa, è necessario analizzarlo per primo: Long.parseLong (timestamp).
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
Instant.ofEpochSecond( 1_280_512_800L )
2010-07-30T18: 00: 00Z
Il nuovo framework java.time incorporato in Java 8 e versioni successive è il successore di Joda-Time.
Queste nuove classi includono un pratico metodo factory per convertire un conteggio di interi secondi da epoca. Ottieni un Instant
, un momento sulla timeline in UTC con una risoluzione massima di nanosecondi.
Instant instant = Instant.ofEpochSecond( 1_280_512_800L );
instant.toString (): 2010-07-30T18: 00: 00Z
Vedi quel codice eseguito dal vivo su IdeOne.com .
Asia/Tehran
orari Asia/Kabul
o Asia/Tehran
? Hai riferito di avere un valore orario di 22:30 invece delle 18:00 viste qui. Sospetto che la tua utilità PHP stia applicando implicitamente un fuso orario predefinito per regolare da UTC. Il mio valore qui è UTC, indicato dalla Z
(abbreviazione di Zulu
, significa UTC). Qualche possibilità che il tuo sistema operativo o PHP sia impostato su fusi orari Asia/Kabul
o Asia/Tehran
? Suppongo di aver segnalato IRST
nella tua produzione, che a quanto pare significa ora in Iran. Attualmente nel 2017 quelle sono le uniche zone che operano con un’estate che è quattro ore e mezza prima dell’ora UTC.
Specificare un nome di fuso orario appropriato nel formato di continent/region
, ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non usare mai l’abbreviazione di 3-4 lettere come EST
o IST
o IRST
poiché non sono veri fusi orari, non standardizzati e nemmeno unici (!).
Se vuoi vedere il tuo momento attraverso l’objective del fuso orario di una particolare regione, applica un ZoneId
per ottenere un ZonedDateTime
. Ancora lo stesso momento simultaneo, ma visto come un tempo diverso per l’orologio a muro .
ZoneId z = ZoneId.of( "Asia/Tehran" ) ; ZonedDateTime zdt = instant.atZone( z ); // Same moment, same point on timeline, but seen as different wall-clock time.
2010-07-30T22: 30 + 04: 30 [Asia / Teheran]
Dovresti restare con le nuove classi java.time. Ma puoi convertire in vecchio se necessario.
java.util.Date date = java.util.Date.from( instant );
AGGIORNAMENTO: il progetto Joda-Time è ora in modalità di manutenzione , con il team che consiglia la migrazione alle classi java.time .
Per tua informazione, il costruttore di un DateTime di Joda-Time è simile: moltiplichi per mille per produrre un long
(non un int
!).
DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );
Meglio evitare le notoriamente fastidiose classi java.util.Date e .Calendar. Ma se devi usare una data, puoi convertire da Joda-Time.
java.util.Date date = dateTime.toDate();
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date
, Calendar
e SimpleDateFormat
.
Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
È ansible scambiare oggetti java.time direttamente con il proprio database. Utilizzare un driver JDBC compatibile con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità per le classi java.sql.*
.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e altro .
Il costruttore della data si aspetta che il valore timeStamp sia in millisecondi. Moltiplica il valore del tuo timestamp con 1000, quindi passa al costruttore.
Se si sta convertendo un valore di timestamp su una macchina diversa, è necessario controllare anche il fuso orario della macchina. Per esempio;
Le suddette decodificazioni risulteranno in valori Data diversi, se si esegue con fusi orari EST o UTC.
Per impostare il fuso orario; alias UTC, puoi semplicemente riscrivere;
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());