tl; dr
Instant.ofEpochSecond(1_220_227_200L)
desconoce sus datos
La gente usa diferentes precisiones en el seguimiento de tiempo que un número desde una epoch. Así que cuando usted obtiene algunos números que se interpretarán como un recuento desde una época, debe determinar:
- Qué época?
Many epochs dates se han utilizado en varios sistemas. Comúnmente utilizado es POSIX/Unix time, donde la época es el primer momento de 1970 en UTC. Pero no debe asumir esta época.
- ¿Qué precisión?
¿Estamos hablando de segundos, milliseconds, microseconds, o nanoseconds desde la época?
- ¿Qué huso horario?
Normalmente, un recuento desde la época está en UTC/GMT zona horaria, es decir, no tiene ningún desfase de zona horaria. Pero a veces, cuando se trata de programadores ignorantes inexpertos o de fecha, puede haber una zona horaria implícita.
En su caso, como han señalado otros, parece que le han dado segundos desde la época de Unix. Pero está 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.
- Lee the doc.

sus datos
Sus datos parece estar en segundos enteros. Si suponemos una época de principios de 1970, y si suponemos zona horaria UTC, a continuación, 1,220,227,200
es el primer momento del primer día de septiembre de 2008.
Joda-Time
El java.util.Date y. Las clases de calendario incluidas con Java son notoriamente problemáticas. Evítales.Utilice en su lugar la biblioteca Joda-Time o la nueva java.time package incluida en Java 8 (e inspirada en Joda-Time).
Tenga en cuenta que a diferencia de j.u.Date, un DateTime
en Joda-Time sabe realmente su propio time zone asignado. Por lo tanto, en el ejemplo del código Joda-Time 2.4 que se ve a continuación, tenga en cuenta que primero se analizan los milisegundos utilizando la suposición predeterminada de UTC. Luego, en segundo lugar, asignamos un huso horario de París para ajustar. Mismo momento en la línea de tiempo del universo, pero diferente wall-clock time. Para la demostración, nos ajustamos de nuevo, 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 del problema en el trabajo de fecha y hora).
Necesitamos milisegundos para construir un DateTime. Así que tome su entrada de segundos y multiplique por mil. Tenga en cuenta que el resultado debe ser un long
de 64 bits, ya que desbordaríamos un int
de 32 bits.
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".
Feed que cuenta de milisegundos para el constructor. Ese constructor en particular asume que el recuento es de la época de Unix de 1970. Así que ajuste la zona horaria según lo deseado, después de la construcción.
Use proper time zone names, una combinación de continente y ciudad/región. Nunca use códigos de 3 o 4 letras, como EST
, ya que no están estandarizados ni son únicos.
DateTime dateTimeParis = new DateTime(milliseconds).withZone(DateTimeZone.forID("Europe/Paris"));
Para la demostración, ajuste la zona horaria nuevamente.
DateTime dateTimeUtc = dateTimeParis.withZone(DateTimeZone.UTC);
DateTime dateTimeMontréal = dateTimeParis.withZone(DateTimeZone.forID("America/Montreal"));
Volcar a la consola. Tenga en cuenta cómo la fecha es diferente en Montreal, ya que el nuevo día ha comenzado en Europa, pero todavía 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 fabricantes de Joda-Time nos han pedido que emigran a su sustitución, el marco java.time tan pronto como sea conveniente. Si bien Joda-Time continúa recibiendo apoyo activo, todo el desarrollo futuro se realizará en las clases java.time y sus extensiones en el proyecto ThreeTen-Extra.
El marco de java-time está definido por JSR 310 y está integrado en Java 8 y posterior. Las clases de java.time se han retrotraído a Java 6 & 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);
Aplicar una offset-from-UTCZoneOffset
para obtener una OffsetDateTime
.
Mejor aún, si se conoce, aplique una zona horaria ZoneId
para obtener un ZonedDateTime
.
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId);
¿Podría decirnos qué valores espera usted? La cuestión de segundos/milisegundos puede ser válida, pero 1220227200 no es 1/1/1970.Parece que estás pasando 0 al constructor. Algún código más podría ayudar. – SJuan76
@mmmiki - debe aceptar una respuesta – Stewart
regresa el 15 de enero de 1970, aquí, no el 1 de enero. – njzk2