Java: data dal timestamp unix


237

Devo convertire un timestamp unix in un oggetto 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 ricevuto da PHP) ma invece ottengo Thu Jan 15 23:11:56 IRST 1970.

Come dovrebbe essere fatto?


3
Se usi Java 8 o versioni successive: dai un'occhiata a questa risposta: stackoverflow.com/a/24703644/1115554
micha,

1
Cordiali saluti, le vecchie classi problematiche di data e ora come java.util.Dateora sono legacy , soppiantate dalle classi java.time . Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:


429

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, allora basta new java.util.Date((long)timeStamp);

Dalla documentazione :

Alloca un oggetto Date e lo inizializza per rappresentare il numero specificato di millisecondi dall'ora base standard nota come "l'epoca", vale a dire il 1 ° gennaio 1970, 00:00:00 GMT.


41
Il cast di (long)è molto importante: senza di esso il numero intero trabocca.
mneri,

2
@TomasK java.util.Dateè il nome completo della classe. Dateè probabilmente la stessa cosa purché importi il java.utilpacchetto sulla tua classe.
Pablo Santa Cruz,

5
Il cast a lungo non è necessario. time = new java.util.Date (timeStamp * 1000L) funziona altrettanto bene (poiché 1000L è un tempo lungo, il timestamp verrà aggiornato a molto prima della moltiplicazione)
Tony BenBrahim

2
Personalmente farei:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral il

3
Cordiali saluti, le vecchie classi problematiche di data e ora come java.util.Dateora sono legacy , soppiantate dalle classi java.time . Vedi Tutorial di Oracle .
Basil Bourque,

60

java.time

Java 8 ha introdotto una nuova API per lavorare con date e orari: il pacchetto java.time .

Con java.time puoi analizzare il tuo conteggio di secondi interi dal riferimento all'epoca del primo momento del 1970 in UTC, 1970-01-01T00: 00Z. Il risultato è un Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

Se hai bisogno java.util.Datedi interoperare con il vecchio codice non ancora aggiornato per java.time , converti. Chiama nuovi metodi di conversione aggiunti alle vecchie classi.

Date date = Date.from( instant );

3
Mentre questa risposta è corretta tecnicamente, nota che le classi java.time soppiantano le vecchie e problematiche classi data-ora come java.util.Date. Le vecchie classi sono eredità e dovrebbero essere evitate. Mentre puoi effettivamente convertire in / dalle classi legacy e java.time, è meglio attenersi a java.time ogni volta che è possibile.
Basil Bourque,

44

Questo è il modo giusto:

Date date = new Date ();
date.setTime((long)unix_time*1000);

27

Sembra che Calendar sia il nuovo modo di procedere:

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 stamperebbe ad esempio "14.06.2012".

Se hai utilizzato System.currentTimeMillis () per salvare il Timestamp non hai bisogno della parte "* 1000".

Se il timestamp in una stringa è necessario prima analizzarlo come long: Long.parseLong (timestamp).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html


8
Attenzione: se timestampè un numero intero devi (long)prima lanciarlo , altrimenti finirai con date sbagliate. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija,

Ho corretto il collegamento.
Ricbit

Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

Il nuovo framework java.time integrato in Java 8 e versioni successive è il successore di Joda-Time.

Queste nuove classi includono un pratico metodo di fabbrica per convertire un conteggio di interi secondi dall'epoca. Ottieni un Instant, un momento sulla linea temporale in UTC con una risoluzione fino a 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 .

Tabella dei tipi di data e ora in Java, sia moderni che legacy

Asia/Kabulo Asia/Tehranfusi orari?

Hai riferito di ottenere un valore dell'ora del giorno di 22:30 invece delle 18:00 visto qui. Sospetto che la tua utility PHP stia applicando implicitamente un fuso orario predefinito per regolare da UTC. Il mio valore qui è UTC, indicato da Z(abbreviazione di Zulu, significa UTC). Qualche possibilità che il tuo sistema operativo o PHP per la tua macchina sia impostato Asia/Kabulo sui Asia/Tehranfusi orari? Suppongo che, come riporta IRSTnella tua uscita, ciò apparentemente significhi tempo dell'Iran. Attualmente nel 2017 quelle sono le uniche zone che operano con un periodo estivo che è quattro ore e mezza avanti rispetto a UTC.

Specificare un nome proprio fuso orario nel formato continent/region, come ad esempio America/Montreal, Africa/Casablancao Pacific/Auckland. Non usare mai il 3-4 lettera sigla come ESTo ISTo IRSTcome sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).

Se vuoi vedere il tuo momento attraverso l'obiettivo del fuso orario di una particolare regione, applica a ZoneIdper ottenere a ZonedDateTime. Sempre lo stesso momento simultaneo, ma visto come un diverso tempo dell'orologio da parete .

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 java.time a classi legacy

È necessario attenersi alle nuove classi java.time. Ma puoi convertirlo in vecchio se necessario.

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

Joda-Time

AGGIORNAMENTO: il progetto Joda-Time è ora in modalità manutenzione , con il team che consiglia la migrazione alle classi java.time .

Cordiali saluti, il costruttore per un DateTime Joda-Time è simile: moltiplicare per mille per produrre un (non un !).longint

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 è necessario utilizzare una data, è possibile convertire da Joda-Time.

java.util.Date date = dateTime.toDate();

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità di java.sql.*classi.

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 è trasferita su Java 6 e 7 in ThreeTen-Backport .
  • androide
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per precedenza Android (<26), il ThreeTenABP progetto si adatta ThreeTen-Backport (di cui sopra). Vedi Come usare ThreeTenABP… .

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


11

Il costruttore della data prevede che il valore di timeStamp sia in millisecondi. Moltiplica il valore del tuo timestamp con 1000, quindi passa al costruttore.


7

Se stai convertendo un valore di data / ora su un altro computer, dovresti anche controllare il fuso orario di quel computer. Per esempio;

Le suddette dichiarazioni comporteranno valori di 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));

6
Non lo consiglierei perché questo imposta il fuso orario per l'intero jvm e non solo il processo di analisi!

1

Per kotlin

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}

0

A volte è necessario lavorare con le regolazioni.

Non usare il cast per molto! Usa il nanoadjustment.

Ad esempio, utilizzando l'API Java di Oanda per il trading è possibile ottenere il datetime come formato UNIX.

Ad esempio: 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

ottieni:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

Inoltre, utilizzare:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );

-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

3
Senza altro testo, non è chiaro perché questa risposta sia preferibile a molte altre in questa domanda. Potete per favore chiarire?
Duncan Jones,

Questo modificherà la data anziché convertirla!
backslashN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.