tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Conozca sus datos
La gente usa varias precisiones para rastrear el tiempo como un número desde una época . Entonces, cuando obtenga algunos números para ser interpretados como un conteo desde una época, debe determinar:
- ¿Qué época?
Se han utilizado fechas de muchas épocas en varios sistemas. Normalmente se utiliza la hora POSIX / Unix , donde la época es el primer momento de 1970 en UTC. Pero no debes asumir esta época.
- ¿Qué precisión?
¿Estamos hablando de segundos, milisegundos , microsegundos o nanosegundos desde la época?
- ¿Qué zona horaria?
Por lo general, un recuento desde que la época está en la zona horaria UTC / GMT, es decir, no tiene ningún desplazamiento de zona horaria. Pero a veces, cuando se involucran programadores sin experiencia o que ignoran la fecha y la hora, puede haber una zona horaria implícita.
En su caso, como señalaron otros, parece que le han dado segundos desde la época de Unix. Pero le estás pasando esos segundos a un constructor que espera milisegundos. Entonces la solución es multiplicar por 1,000.
Lecciones aprendidas:
- Determine, no asuma, el significado de los datos recibidos.
- Leer el doc .
Tu información
Tus datos parecen estar en segundos enteros. Si asumimos una época de principios de 1970, y si asumimos la zona horaria UTC, entonces 1,220,227,200
es el primer momento del primer día de septiembre de 2008.
Joda-Time
Las clases java.util.Date y .Calendar incluidas con Java son notoriamente problemáticas. Evítales. En su lugar, utilice la biblioteca Joda-Time o el nuevo paquete java.time incluido en Java 8 (e inspirado en Joda-Time).
Tenga en cuenta que, a diferencia de juDate, DateTime
en Joda-Time realmente conoce su propia zona horaria asignada . Entonces, en el ejemplo de código Joda-Time 2.4 que se ve a continuación, tenga en cuenta que primero analizamos los milisegundos utilizando la suposición predeterminada de UTC. Luego, en segundo lugar, asignamos una zona horaria de París para ajustar. Mismo momento en la línea de tiempo del Universo, pero diferente hora del reloj de pared . Para la demostración, ajustamos nuevamente a UTC. Casi siempre es mejor especificar explícitamente su zona horaria deseada / esperada en lugar de confiar en un valor predeterminado implícito (a menudo la causa de problemas en el trabajo de fecha y hora).
Necesitamos milisegundos para construir un DateTime. Así que tome su entrada de segundos y multiplíquela por mil. Tenga en cuenta que el resultado debe ser de 64 bits, long
ya que desbordaríamos uno de 32 bits int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Alimente ese recuento de milisegundos al constructor. Ese constructor en particular asume que el recuento es de la época Unix de 1970. Por lo tanto, ajuste la zona horaria como desee, después de la construcción.
Utilice nombres de zona horaria adecuados , una combinación de continente y ciudad / región. Nunca use códigos de 3 o 4 letras, ya EST
que no están estandarizados ni son únicos.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Para la demostración, vuelva a ajustar la zona horaria.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Volcar a la consola. Observe cómo la fecha es diferente en Montreal, ya que el nuevo día ha comenzado en Europa pero aún no en América.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Cuando se ejecuta.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Los creadores de Joda-Time nos han pedido que migremos a su reemplazo, el marco java.time tan pronto como sea conveniente. Si bien Joda-Time continúa recibiendo soporte activo, todo el desarrollo futuro se realizará en las clases java.time y sus extensiones en el proyecto ThreeTen-Extra.
El marco de tiempo de Java está definido por JSR 310 y está integrado en Java 8 y versiones posteriores. Las clases java.time se han adaptado a Java 6 y 7 en el proyecto ThreeTen-Backport y a Android en el proyecto ThreeTenABP .
Un Instant
es un momento en la línea de tiempo en UTC con una resolución de nanosegundos. Su época es el primer momento de 1970 en UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Aplique un desplazamiento de UTC ZoneOffset
para obtener un OffsetDateTime
.
Mejor aún, si lo conoce, aplique una zona horaria ZoneId
para obtener un ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );