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.
Conheça seus dados
As pessoas usam várias precisões para rastrear o tempo como um número desde uma época . Portanto, ao obter alguns números a serem interpretados como uma contagem desde uma época, você deve determinar:
- Que época?
Muitas datas de épocas foram usadas em vários sistemas. Normalmente usado é o horário POSIX / Unix , onde a época é o primeiro momento de 1970 no UTC. Mas você não deve assumir esta época.
- Que precisão?
Estamos falando de segundos, milissegundos , microssegundos ou nanossegundos desde a época?
- Qual fuso horário?
Normalmente, uma contagem desde que a época está no fuso horário UTC / GMT, ou seja, não tem deslocamento de fuso horário. Mas às vezes, ao envolver programadores inexperientes ou ignorantes de data e hora, pode haver um fuso horário implícito.
No seu caso, como outros notaram, você parece ter recebido segundos desde a época do Unix. Mas você está passando esses segundos para um construtor que espera milissegundos. Portanto, a solução é multiplicar por 1.000.
Lições aprendidas:
- Determine, não assuma, o significado dos dados recebidos.
- Leia o doc .
Seus dados
Seus dados parecem estar em segundos inteiros. Se assumirmos uma época do início de 1970, e se assumirmos o fuso horário UTC, então 1,220,227,200
é o primeiro momento do primeiro dia de setembro de 2008.
Joda-Time
As classes java.util.Date e .Calendar agrupadas com Java são notoriamente problemáticas. Evite-os. Em vez disso, use a biblioteca Joda-Time ou o novo pacote java.time empacotado em Java 8 (e inspirado em Joda-Time).
Observe que, ao contrário de juDate, um DateTime
em Joda-Time realmente conhece seu próprio fuso horário atribuído . Portanto, no código Joda-Time 2.4 de exemplo visto abaixo, observe que primeiro analisamos os milissegundos usando a suposição padrão de UTC. Então, em segundo lugar, atribuímos um fuso horário de Paris para ajustar. Mesmo momento na linha do tempo do Universo, mas com um relógio de parede diferente . Para demonstração, ajustamos novamente, para UTC. Quase sempre é melhor especificar explicitamente o fuso horário desejado / esperado, em vez de confiar em um padrão implícito (frequentemente a causa de problemas no trabalho de data e hora).
Precisamos de milissegundos para construir um DateTime. Portanto, pegue a sua entrada de segundos e multiplique por mil. Observe que o resultado deve ser de 64 bits, long
pois estouraríamos um 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 essa contagem de milissegundos para o construtor. Esse construtor particular assume que a contagem é da época Unix de 1970. Portanto, ajuste o fuso horário conforme desejado, após a construção.
Use nomes de fuso horário adequados , uma combinação de continente e cidade / região. Nunca use códigos de 3 ou 4 letras, EST
pois eles não são padronizados nem únicos.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Para demonstração, ajuste o fuso horário novamente.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Despeje para o console. Observe como a data é diferente em Montreal, pois o novo dia começou na Europa, mas ainda não na América.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Quando corre.
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
Os criadores do Joda-Time nos pediram para migrar para seu substituto, o framework java.time , assim que for conveniente. Enquanto Joda-Time continua a ter suporte ativo, todo o desenvolvimento futuro será feito nas classes java.time e suas extensões no projeto ThreeTen-Extra.
A estrutura java-time é definida pelo JSR 310 e integrada no Java 8 e posterior. As classes java.time foram portadas para Java 6 e 7 no projeto ThreeTen-Backport e para Android no projeto ThreeTenABP .
Um Instant
é um momento na linha do tempo em UTC com resolução de nanossegundos. Sua época é o primeiro momento de 1970 na UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Aplique um offset-from-UTC ZoneOffset
para obter um OffsetDateTime
.
Melhor ainda, se conhecido, aplique um fuso horário ZoneId
para obter um ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );