Tempo di epoche Unix per l'oggetto Java Date


85

Ho una stringa contenente l'ora UNIX Epoch e devo convertirla in un oggetto Java Date.

String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
  Date expiry = df.parse(date);
 } catch (ParseException ex) {
  ex.getStackTrace();
}

La linea segnata è dove ho problemi. Non riesco a capire quale dovrebbe essere l'argomento di SimpleDateFormat (), o anche se dovrei usare SimpleDateFormat ().


Vedi la mia risposta dettagliata a una domanda simile sulla conversione tra millisecondi in data-ora con codice di esempio utilizzando la libreria Joda-Time.
Basil Bourque

private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
JVJplus

Risposte:


129

Che ne dici di:

Date expiry = new Date(Long.parseLong(date));

EDIT: come per la risposta di rde6173 e dando uno sguardo più da vicino all'input specificato nella domanda, "1081157732" sembra essere un valore di epoca basato sui secondi, quindi dovresti moltiplicare il long da parseLong () per 1000 per convertire in millisecondi, che è ciò che utilizza il costruttore Date di Java, quindi:

Date expiry = new Date(Long.parseLong(date) * 1000);

4
Non sarebbe tecnicamente errato in quanto non tiene conto dei secondi intercalari?
Maciej Piechotka

1
Maciej, l'epoca "basata sui secondi" di op conta già per i secondi intercalari, è basata sui "secondi". Quindi questa risposta è corretta.
theecarpy

1
Mi dà valori errati se moltiplicato per 1000, non c'è un modo migliore per farlo?
Ishaan

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

La domanda era dall'epoca, che è UTC mentre la data si aspetta che il lungo sia dal GMT, sono gli stessi?
Luca

37

L'epoca è il numero di secondi dal 1 ° gennaio 1970 ..

Così:

String epochString = "1081157732";
long epoch = Long.parseLong( epochString );
Date expiry = new Date( epoch * 1000 );

Per ulteriori informazioni: http://www.epochconverter.com/


1
Funziona a meraviglia ... IDK Y non è stato verificato come risposta :)
Makky

Grazie per questa risposta. Ero seduto qui cercando di istanziare una data di un'epoca e il risultato era sempre un giorno nel 1970, ed era perché stavo inconsapevolmente dando a Java millisecondi, non secondi :)
Lo-Tan

24

java.time

Utilizzando il java.timeframework integrato in Java 8 e versioni successive.

import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;

long epoch = Long.parseLong("1081157732");
Instant instant = Instant.ofEpochSecond(epoch);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]

In questo caso è meglio ZonedDateTimecontrassegnarlo come data nel fuso orario UTC perché Epoch è definito in UTC in nell'ora Unix utilizzata da Java.

ZoneOffsetcontiene una comoda costante per il fuso orario UTC, come mostrato nell'ultima riga sopra. La sua superclasse, ZoneIdpuò essere utilizzata per adattarsi ad altri fusi orari.

ZoneId zoneId = ZoneId.of( "America/Montreal" );

Buona risposta. Suggerirei di eliminare LocalDateTimee mostrare solo a ZonedDateTime. Nella maggior parte delle app aziendali, ZonedDateTimeè il modo migliore per andare. Le persone tendono a mettersi nei guai / confondere con i LocalXXXtipi.
Basil Bourque

7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)


0

Per convertire il timestamp dei secondi in un timestamp dei millisecondi. Potresti usare l'API TimeUnit e pulito in questo modo.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


-1

Hum ... se non sbaglio, l'ora di UNIX Epoch è in realtà la stessa cosa di

System.currentTimeMillis()

Quindi scrivere

try {
    Date expiry = new Date(Long.parseLong(date));
}
catch(NumberFormatException e) {
    // ...
}

dovrebbe funzionare (ed essere molto più veloce nell'analisi della data)


4
Di solito il tempo dell'epoca di Unix è misurato in secondi, non in millisecondi.
Simon Nickerson
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.