Java: fecha de la marca de tiempo de Unix

Resuelto Ariyan asked hace 14 años • 11 respuestas

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

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

El valor de la marca de tiempo es:1280512800

La fecha debería ser "30/07/2010 - 22:30:00" (como la obtengo mediante PHP), pero en su lugar aparece Thu Jan 15 23:11:56 IRST 1970.

¿Cómo deberia hacerse?

Ariyan avatar Jul 30 '10 19:07 Ariyan
Aceptado

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

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

Si ya tenías milisegundos, entonces simplementenew java.util.Date((long)timeStamp);

De la documentación :

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

Pablo Santa Cruz avatar Jul 30 '2010 12:07 Pablo Santa Cruz

java.tiempo

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

Con java.time puede analizar el 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 java.util.Dateinteroperar con código antiguo que aún no se ha actualizado para java.time , conviértalo. Llame a nuevos métodos de conversión agregados a las clases antiguas.

Date date = Date.from( instant );
micha avatar Jul 11 '2014 17:07 micha

Esta es la manera correcta:

Date date = new Date ();
date.setTime((long)unix_time*1000);
Marco Fantasia avatar Sep 13 '2011 15:09 Marco Fantasia

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18:00:00Z

java.tiempo

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

Estas nuevas clases incluyen un práctico método de fábrica para convertir un conteo de segundos completos a partir de una época. Obtienes Instantun momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

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

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

Tabla de tipos de fecha y hora en Java, tanto moderna como heredada

Asia/Kabulo Asia/Tehranzonas horarias?

Informó que obtuvo un valor de 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 ajustarse desde UTC. Mi valor aquí es UTC, indicado por Z(abreviatura de Zulu, significa UTC). ¿Existe alguna posibilidad de que el sistema operativo o PHP de su máquina esté configurado Asia/Kabulen Asia/Tehranzonas horarias? Supongo que sí, ya que usted informa IRSTen su salida que aparentemente significa hora de Irán. Actualmente, en 2017, esas son las únicas zonas que operan con un horario de verano cuatro horas y media por delante de UTC.

Especifique un nombre de zona horaria adecuado en el formato de continent/region, como America/Montreal, Africa/Casablancao Pacific/Auckland. Nunca utilice abreviaturas de 3 o 4 letras como ESTo ISTo, ya que noIRST son zonas horarias reales, no están estandarizadas y ni siquiera son ú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 un 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 seguir con las nuevas clases java.time. Pero puedes convertirlo a antiguo si es necesario.

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

Tiempo Joda

ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento y el equipo recomienda la migración a las clases java.time .

Para su información, el constructor de Joda-Time DateTime es similar: multiplique 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 utilizar una fecha, puede convertir desde Joda-Time.

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

Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases reemplazan a las antiguas y problemáticas clases de fecha y hora heredadas , como java.util.Date, Calendary 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 posteriores
    • Incorporado.
    • Parte de la API de Java estándar con una implementación incluida.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP… .

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

Basil Bourque avatar Jul 11 '2014 20:07 Basil Bourque

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 sólo un ejemplo de cómo usarla; ésta imprimiría, 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, primero debe analizarla como larga: Long.parseLong (marca de tiempo).

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

Stefan avatar Jun 26 '2012 10:06 Stefan