from - timestamp to date java
Java: fecha a partir de la marca de tiempo de Unix (8)
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 "30/07/2010 - 22:30:00” (tal como la obtengo por PHP), pero en lugar de eso, recibo el Thu Jan 15 23:11:56 IRST 1970
.
¿Cómo se debería hacer?
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 método Date.from()
estático puede convertir un Instant
a una instancia de java.util.Date
.
tl; dr
Instant.ofEpochSecond( 1_280_512_800L )
2010-07-30T18: 00: 00Z
java.time
El nuevo framework java.time integrado en Java 8 y versiones posteriores es el sucesor de Joda-Time.
Estas nuevas clases incluyen un método práctico de fábrica para convertir una cuenta de segundos enteros desde la época. Obtienes 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 que el código se ejecute en vivo en IdeOne.com .
¿Zonas horarias 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 muestran 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 la Z
(abreviatura de Zulu
, significa UTC). ¿Hay alguna posibilidad de que su sistema operativo o PHP esté configurado en zonas horarias de Asia/Kabul
o Asia/Tehran
? Supongo que cuando informe a IRST
en su salida, lo que aparentemente significa la hora de Irán. Actualmente, en 2017, esas son las únicas zonas que operan con un horario de verano que es de cuatro horas y media más que UTC.
Especifique un nombre de zona horaria adecuado en el formato de continent/region
, como America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Nunca use la abreviatura de 3 a 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 una zona horaria en particular, aplique un 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]
Convertir de java.time a clases heredadas
Debes seguir con las nuevas clases de java.time. Pero se puede convertir a antiguo si es necesario.
java.util.Date date = java.util.Date.from( instant );
Tiempo de joda
ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento , con el equipo que aconseja la migración a las clases de 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 usar 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 java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date
, java.util.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 busca para 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 se necesitan cadenas, no se necesitan clases java.sql.*
.
¿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 en paquete.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
- Android
- Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
- Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .
El proyecto ThreeTen-Extra extiende 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 more .
El constructor de Date espera que el valor de timeStamp esté en milisegundos. Multiplica el valor de tu marca de tiempo por 1000, luego pasa al constructor.
Esta es la manera correcta:
Date date = new Date ();
date.setTime((long)unix_time*1000);
Para 1280512800
, multiplique por 1000, ya que java está esperando milisegundos:
java.util.Date time=new java.util.Date((long)timeStamp*1000);
Si ya tenía milisegundos, entonces simplemente new java.util.Date((long)timeStamp);
De la documentation :
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.
Parece que el calendario es la nueva manera de ir:
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 usarlo, este se imprimiría, por ejemplo, "14.06.2012".
Si ha usado 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 un largo: Long.parseLong (marca de tiempo).
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
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 resultarán en valores de Fecha diferentes, si se ejecuta con las zonas horarias EST o UTC.
Para establecer la zona horaria; También conocido como UTC, puede simplemente 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());