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


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

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/


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

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)


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)


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


4
Por lo general, el tiempo de época de Unix se mide en segundos, no en milisegundos.
Simon Nickerson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.