Java: data da timestamp unix

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.time

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

tl; dr

 Instant.ofEpochSecond( 1_280_512_800L ) 

2010-07-30T18: 00: 00Z

java.time

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]

Conversione da classi java.time a legacy

Dovresti restare con le nuove classi java.time. Ma puoi convertire in vecchio se necessario.

 java.util.Date date = java.util.Date.from( instant ); 

Joda-Time

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(); 

A proposito di java.time

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?

  • Java SE 8 , Java SE 9 e versioni successive
    • Built-in.
    • 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
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per Android precedente (<26), il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP ….

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());