Tiempo de época de Unix al objeto Fecha de Java

84

Tengo una cadena que contiene la época de UNIX Epoch y necesito convertirla en un objeto Java Date.

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

La línea marcada es donde tengo problemas. No puedo averiguar cuál debería ser el argumento para SimpleDateFormat (), o incluso si debería usar SimpleDateFormat ().

Xenph Yan
fuente
Vea mi respuesta detallada a una pregunta similar sobre la conversión de milisegundos a fecha y hora con código de ejemplo usando la biblioteca 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

Respuestas:

125

¿Qué tal solo:

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

EDITAR: según la respuesta de rde6173 y observando más de cerca la entrada especificada en la pregunta, "1081157732" parece ser un valor de época basado en segundos, por lo que debería multiplicar el largo de parseLong () por 1000 para convertir a milisegundos, que es lo que usa el constructor Date de Java, entonces:

Date expiry = new Date(Long.parseLong(date) * 1000);
Marc Novakowski
fuente
4
¿No sería esto técnicamente incorrecto ya que no tiene en cuenta los segundos intercalares?
Maciej Piechotka
1
Maciej, la época "basada en segundos" de op ya representa los segundos intercalares, está basada en "segundos". Entonces esta respuesta es correcta.
thecarpy
1
Me da valores incorrectos si se multiplica por 1000, ¿no hay una mejor manera de hacerlo?
Ishaan
1
Para su información, las clases de fecha y hora antiguas terriblemente problemáticas como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y versiones posteriores. Consulte el tutorial de Oracle .
Basil Bourque
La pregunta era desde la época, que es UTC mientras que la fecha espera que sea larga desde GMT, ¿son iguales?
Lucas
37

Época es el número de segundos desde el 1 de enero de 1970 ..

Entonces:

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

Para obtener más información: http://www.epochconverter.com/

Ryan Emerle
fuente
1
Esto funciona de maravilla ... IDK Y esto no se ha marcado como Respuesta :)
Makky
Gracias por esta respuesta. Estaba sentado aquí tratando de crear una instancia de una fecha de una época y el resultado siempre fue algún día en 1970, y fue porque, sin saberlo, estaba dando milisegundos de Java, no segundos :)
Lo-Tan
24

java.time

Usando el java.timemarco integrado en Java 8 y versiones posteriores.

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]

En este caso, es mejor usar ZonedDateTimepara marcarlo como fecha en la zona horaria UTC porque Epoch se define en UTC en la hora Unix utilizada por Java.

ZoneOffsetcontiene una útil constante para la zona horaria UTC, como se ve en la última línea de arriba. Su superclase ZoneIdse puede utilizar para adaptarse a otras zonas horarias.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
Przemek
fuente
Buena respuesta. Sugeriría dejar caer el LocalDateTimey solo mostrar un ZonedDateTime. En la mayoría de las aplicaciones comerciales, ZonedDateTimees la mejor manera de hacerlo. Las personas tienden a meterse en problemas / confusión con los LocalXXXtipos.
Basil Bourque
7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)
tcurdt
fuente
0

Mejor aún, use JodaTime . Es mucho más fácil analizar cadenas y convertirlas en cadenas. También es seguro para subprocesos. Vale la pena el tiempo que le llevará implementarlo.

Hombre LoboDragón
fuente
Para su información, el proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja la migración a las clases java.time . Consulte el tutorial de Oracle .
Basil Bourque
0

Para convertir la marca de tiempo de segundos en marca de tiempo de milisegundos. Podrías usar la API TimeUnit y hacerlo así.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

Dinesh Jayabalan
fuente
-1

Hum ... si no me equivoco, la época de UNIX es en realidad lo mismo que

System.currentTimeMillis()

Entonces escribiendo

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

debería funcionar (y ser mucho más rápido que el análisis de la fecha)

Varkhan
fuente
4
Por lo general, el tiempo de época de Unix se mide en segundos, no en milisegundos.
Simon Nickerson