Java: fecha de la marca de tiempo de Unix

237

Necesito convertir una marca de tiempo de Unix en un objeto de fecha.
Intenté esto:

java.util.Date time = new java.util.Date(timeStamp);

El valor de la marca de tiempo es: 1280512800

La fecha debe ser "2010/07/30 - 22:30:00" (como lo obtengo por PHP) pero en su lugar obtengo Thu Jan 15 23:11:56 IRST 1970.

¿Cómo se debería hacer?

RYN
fuente
3
Si usa Java 8 o más reciente: eche un vistazo a esta respuesta: stackoverflow.com/a/24703644/1115554
micha
1
Para su información, las viejas clases problemáticas de fecha y hora, como java.util.Dateahora son heredadas , suplantadas por las clases java.time . Ver Tutorial de Oracle .
Basil Bourque

Respuestas:

429

Para 1280512800, multiplique por 1000, ya que Java espera milisegundos:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

Si ya tenía milisegundos, entonces solo new java.util.Date((long)timeStamp);

De la documentación :

Asigna un objeto Date y lo inicializa para representar el número especificado de milisegundos desde el tiempo base estándar conocido como "la época", es decir, el 1 de enero de 1970, 00:00:00 GMT.

Pablo Santa Cruz
fuente
41
La conversión a (long)es muy importante: sin ella, el número entero se desborda.
mneri
2
@TomasK java.util.Datees el nombre completo de la clase. Dateprobablemente sea exactamente lo mismo siempre que importe el java.utilpaquete en su clase.
Pablo Santa Cruz
55
El yeso a largo no es necesario. time = new java.util.Date (timeStamp * 1000L) funciona igual de bien (dado que 1000L es largo, la marca de tiempo se emitirá mucho antes de la multiplicación)
Tony BenBrahim
2
Yo personalmente haría:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral
3
Para su información, las viejas clases problemáticas de fecha y hora, como java.util.Dateahora son heredadas , suplantadas por las clases java.time . Ver Tutorial de Oracle .
Basil Bourque
60

java.time

Java 8 introdujo una nueva API para trabajar con fechas y horas: el paquete java.time .

Con java.time puede analizar su recuento de segundos completos desde la referencia de época del primer momento de 1970 en UTC, 1970-01-01T00: 00Z. El resultado es un Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

Si necesita un java.util.Datepara interoperar con código antiguo que aún no se ha actualizado para java.time , convierta. Llame a nuevos métodos de conversión agregados a las clases antiguas.

Date date = Date.from( instant );
micha
fuente
3
Si bien esta respuesta es correcta técnicamente, tenga en cuenta que las clases java.time suplantan a las antiguas clases problemáticas de fecha y hora como java.util.Date. Las viejas clases son heredadas y deben evitarse. Si bien puede convertir a / desde las clases legacy y java.time, es mejor quedarse con java.time siempre que sea posible.
Basil Bourque
44

Esta es la manera correcta:

Date date = new Date ();
date.setTime((long)unix_time*1000);
Marco Fantasia
fuente
27

Parece que Calendar es el nuevo camino a seguir:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

La última línea es solo un ejemplo de cómo usarla, esta imprimirá, por ejemplo, "14.06.2012".

Si ha utilizado System.currentTimeMillis () para guardar la marca de tiempo, no necesita la parte "* 1000".

Si tiene la marca de tiempo en una cadena, debe analizarla primero como un largo: Long.parseLong (marca de tiempo).

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

Stefan
fuente
8
Advertencia: si timestampes un número entero (long), primero debe emitirlo, de lo contrario, terminará con fechas incorrectas. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija
He arreglado el enlace.
Ricbit
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .
Basil Bourque
26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

El nuevo marco java.time integrado en Java 8 y posterior es el sucesor de Joda-Time.

Estas nuevas clases incluyen un práctico método de fábrica para convertir una cuenta de segundos enteros de época. Obtiene un Instantmomento en la línea de tiempo en UTC con una resolución de hasta nanosegundos.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010-07-30T18: 00: 00Z

Vea ese código en vivo en IdeOne.com .

Tabla de tipos de fecha y hora en Java, tanto modernos como heredados

Asia/Kabulo Asia/Tehranzonas horarias?

Informó que obtuvo un valor de la hora del día de 22:30 en lugar de las 18:00 que se ven aquí. Sospecho que su utilidad PHP está aplicando implícitamente una zona horaria predeterminada para ajustar desde UTC. Mi valor aquí es UTC, representado por Z(abreviatura Zulu, significa UTC). Cualquier posibilidad de que su sistema operativo de la máquina o PHP se establece en Asia/Kabulo Asia/Tehranzonas horarias? Supongo que así como informas IRSTen tu salida, lo que aparentemente significa hora de Irán. Actualmente en 2017, esas son las únicas zonas que operan con un horario de verano que es cuatro horas y media antes de UTC.

Especificar un nombre de zona horaria correcta en el formato de continent/region, por ejemplo America/Montreal, Africa/Casablancao Pacific/Auckland. Nunca use la abreviatura de 3-4 letras como ESTo ISTo IRSTya que no son zonas horarias verdaderas, ni estandarizadas, ni siquiera únicas (!).

Si desea ver su momento a través de la lente de la zona horaria de una región en particular, aplique a ZoneIdpara obtener a ZonedDateTime. Sigue siendo el mismo momento simultáneo, pero visto como un reloj de pared diferente .

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 / Teherán]

Conversión de java.time a clases heredadas

Deberías quedarte con las nuevas clases java.time. Pero puede convertir a viejo si es necesario.

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

Joda-Time

ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja migrar a las clases java.time .

FYI, el constructor para un Joda-Time DateTime es similar: multiplica por mil para producir un long(¡no un int!).

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

Lo mejor es evitar las clases java.util.Date y .Calendar notoriamente problemáticas. Pero si debe usar una Fecha, puede convertir de Joda-Time.

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

Sobre java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, Calendar, y SimpleDateFormat.

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de java.sql.*clases.

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
    • Para anteriormente Android (<26), el ThreeTenABP proyecto adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo utilizar ThreeTenABP ... .

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .

Albahaca Bourque
fuente
11

El constructor de Date espera que el valor de timeStamp esté en milisegundos. Multiplique el valor de su marca de tiempo con 1000, luego pase al constructor.

f1sh
fuente
7

Si está convirtiendo un valor de marca de tiempo en una máquina diferente, también debe verificar la zona horaria de esa máquina. Por ejemplo;

Las descripciones anteriores generarán valores de Fecha diferentes, si ejecuta con zonas horarias EST o UTC.

Para establecer la zona horaria; también conocido como UTC, simplemente puede reescribir;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
tmr
fuente
66
¡No recomendaría esto porque establece la zona horaria para todo el jvm y no solo el proceso de análisis!
1

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

}
kzncrda
fuente
0

A veces necesitas trabajar con ajustes.

¡No uses el yeso por mucho tiempo! Use nanoajuste.

Por ejemplo, utilizando la API Java de Oanda para el comercio, puede obtener la fecha y hora como formato UNIX.

Por ejemplo: 1592523410.590566943

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

usted obtiene:

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

Además, use:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );
Damir Isanbirdin
fuente
-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
Masatsugu Hosoi
fuente
3
Sin más texto, no está claro por qué esta respuesta es preferible a las muchas otras en esta pregunta. ¿Puedes por favor aclarar?
Duncan Jones
¡Esto modificará la fecha en lugar de convertirla!
barra invertidaN