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?
java.util.Date
ahora son heredadas , suplantadas por las clases java.time . Ver Tutorial de Oracle .Respuestas:
Para
1280512800
, multiplique por 1000, ya que Java espera milisegundos:Si ya tenía milisegundos, entonces solo
new java.util.Date((long)timeStamp);
De la documentación :
fuente
(long)
es muy importante: sin ella, el número entero se desborda.java.util.Date
es el nombre completo de la clase.Date
probablemente sea exactamente lo mismo siempre que importe eljava.util
paquete en su clase.Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
java.util.Date
ahora son heredadas , suplantadas por las clases java.time . Ver Tutorial de Oracle .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
.Si necesita un
java.util.Date
para 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.fuente
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.Esta es la manera correcta:
fuente
Parece que Calendar es el nuevo camino a seguir:
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
fuente
timestamp
es un número entero(long)
, primero debe emitirlo, de lo contrario, terminará con fechas incorrectas.mydate.setTimeInMillis((long) timestamp*1000);
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .tl; dr
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
Instant
momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos.Vea ese código en vivo en IdeOne.com .
Asia/Kabul
oAsia/Tehran
zonas 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
(abreviaturaZulu
, significa UTC). Cualquier posibilidad de que su sistema operativo de la máquina o PHP se establece enAsia/Kabul
oAsia/Tehran
zonas horarias? Supongo que así como informasIRST
en 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 ejemploAmerica/Montreal
,Africa/Casablanca
oPacific/Auckland
. Nunca use la abreviatura de 3-4 letras comoEST
oIST
oIRST
ya 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
ZoneId
para obtener aZonedDateTime
. Sigue siendo el mismo momento simultáneo, pero visto como un reloj de pared diferente .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.
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 unint
!).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.
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
, ySimpleDateFormat
.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?
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 .fuente
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.
fuente
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;
fuente
Para kotlin
fuente
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
usted obtiene:
Además, use:
fuente
fuente