Java: fecha de la marca de tiempo de Unix

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 debería ser “2010/07/30 – 22:30:00” (como la obtengo de PHP), pero en su lugar recibo Thu Jan 15 23:11:56 IRST 1970 .

¿Cómo deberia hacerse?

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 e 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.

Esta es la manera correcta:

 Date date = new Date (); date.setTime((long)unix_time*1000); 

java.time

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

Con java.time puedes usar:

 Date date = Date.from( Instant.ofEpochSecond( timeStamp ) ); 

Un Instant representa una marca de tiempo en Java 8. Con el Date.from() estático Date.from() puede convertir un Instant a una instancia de java.util.Date .

Parece que el calendario es la nueva forma de hacerlo:

 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ía, por ejemplo, “14.06.2012”.

Si ha utilizado System.currentTimeMillis () para guardar Timestamp, 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

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 un recuento de segundos enteros de la época. Obtiene un Instant , un 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.toString (): 2010-07-30T18: 00: 00Z

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

Asia/Kabul Asia/Tehran horario de Asia/Kabul o Asia/Tehran ?

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 aplica implícitamente una zona horaria predeterminada para ajustarse a partir de UTC. Mi valor aquí es UTC, significado por Z (abreviatura de Zulu , significa UTC). ¿Hay alguna posibilidad de que su sistema operativo de máquina o PHP esté configurado en zonas horarias de Asia/Kabul o Asia/Tehran ? Supongo que así es como informas el IRST en tu producción, lo que aparentemente significa tiempo para Irán. Actualmente, en 2017, esas son las únicas zonas que operan con un horario de verano cuatro horas y media más que UTC.

Especifique un nombre de zona horaria adecuada en el formato continent/region , como America/Montreal , Africa/Casablanca o Pacific/Auckland . Nunca use la abreviatura de 3-4 letras, como EST o IST o IRST ya que no son zonas horarias verdaderas, 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 un ZoneId para obtener un ZonedDateTime . Sigue siendo el mismo momento simultáneo, pero se ve como un tiempo de 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 de 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 recomienda la migración a las clases java.time .

FYI, el constructor de un 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 notoriamente problemáticas clases java.util.Date y .Calendar. Pero si debe usar una Fecha, puede convertir Joda-Time.

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

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas 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. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de 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 y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete 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 terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

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

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 darán como resultado diferentes valores de Fecha, si se ejecuta con zonas horarias EST o UTC.

Para establecer la zona horaria; alias a UTC, simplemente puede reescribir;

  TimeZone.setDefault(TimeZone.getTimeZone("UTC")); java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000)); 
 Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());