Java: fecha de la marca de tiempo de Unix
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?
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.
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.Date
interoperar 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 );
Esta es la manera correcta:
Date date = new Date ();
date.setTime((long)unix_time*1000);
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 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áneo.toString(): 2010-07-30T18:00:00Z
Vea ese código ejecutado en vivo en IdeOne.com .
Asia/Kabul
o Asia/Tehran
zonas 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/Kabul
en Asia/Tehran
zonas horarias? Supongo que sí, ya que usted informa IRST
en 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/Casablanca
o Pacific/Auckland
. Nunca utilice abreviaturas de 3 o 4 letras como EST
o IST
o, 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 ZoneId
para 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
, 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 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 .YearWeek
YearQuarter
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