Java: Data do registro de data e hora unix

237

Eu preciso converter um timestamp unix em um objeto de data.
Eu tentei isso:

java.util.Date time = new java.util.Date(timeStamp);

O valor do carimbo de data / hora é: 1280512800

A data deve ser "30/07/2010 - 22:30:00" (como eu entendo pelo PHP), mas, em vez disso, entendo Thu Jan 15 23:11:56 IRST 1970.

Como isso deve ser feito?

RYN
fonte
3
Se você usa o Java 8 ou mais recente: Dê uma olhada nesta resposta: stackoverflow.com/a/24703644/1115554
micha
1
Para sua informação, as antigas classes problemáticas de data e hora, como java.util.Dateagora são herdadas , substituídas pelas classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque

Respostas:

429

Para 1280512800 , multiplique por 1000, desde java está esperando milissegundos:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

Se você já tinha milissegundos, basta new java.util.Date((long)timeStamp);

A partir da documentação :

Aloca um objeto Date e o inicializa para representar o número especificado de milissegundos desde o tempo base padrão conhecido como "a época", ou seja, 1 de janeiro de 1970, 00:00:00 GMT.

Pablo Santa Cruz
fonte
41
A conversão para (long)é muito importante: sem ela, o número inteiro excede.
mneri
2
@TomasK java.util.Dateé o nome completo da classe. Dateprovavelmente é exatamente a mesma coisa, desde que você importe o java.utilpacote em sua classe.
Pablo Santa Cruz
5
O elenco para longo não é necessário. Tempo = new java.util.Date (timeStamp * 1000L) funciona tão bem (desde 1000L é um longo, timestamp será upcast a uma longa antes da multiplicação)
Tony Benbrahim
2
Eu pessoalmente faria:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral
3
Para sua informação, as antigas classes problemáticas de data e hora, como java.util.Dateagora são herdadas , substituídas pelas classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque
60

java.time

Java 8 introduziu uma nova API para trabalhar com datas e horas: o pacote java.time .

Com java.time, você pode analisar sua contagem de segundos inteiros desde a referência da época do primeiro momento de 1970 no UTC, 1970-01-01T00: 00Z. O resultado é umInstant .

Instant instant = Instant.ofEpochSecond( timeStamp );

Se você precisar java.util.Dateinteroperar com o código antigo ainda não atualizado para java.time , converta. Chame novos métodos de conversão adicionados às classes antigas.

Date date = Date.from( instant );
micha
fonte
3
Embora esta resposta esteja tecnicamente correta, observe que as classes java.time substituem as antigas classes problemáticas de data e hora, como java.util.Date. As classes antigas são legadas e devem ser evitadas. Embora você possa realmente converter de / para as classes legacy e java.time, é melhor ficar com java.time sempre que possível.
Basil Bourque 07/02
44

Este é o caminho certo:

Date date = new Date ();
date.setTime((long)unix_time*1000);
Marco Fantasia
fonte
27

Parece que o Google Agenda é o novo caminho:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

A última linha é apenas um exemplo de como usá-la, esta imprimiria, por exemplo, "14.06.2012".

Se você usou System.currentTimeMillis () para salvar o carimbo de data / hora, não precisa da parte "* 1000".

Se você tiver o registro de data e hora em uma sequência, precisará analisá-lo primeiro como um longo: Long.parseLong (registro de data e hora).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

Stefan
fonte
8
Aviso: se timestampfor um número inteiro, você precisará convertê-lo (long)primeiro, caso contrário, você terminará com datas incorretas. mydate.setTimeInMillis((long) timestamp*1000);
Svenkapudija
Eu consertei o link.
Ricbit
FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
manjericão Bourque
26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

A nova estrutura java.time incorporada no Java 8 e posterior é a sucessora do Joda-Time.

Essas novas classes incluem um método prático de fábrica para converter uma contagem de segundos inteiros da época. Você recebe Instantum momento na linha do tempo no UTC com resolução de até nanossegundos.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010-07-30T18: 00: 00Z

Veja esse código executado ao vivo em IdeOne.com .

Tabela de tipos de data e hora em Java, modernos e herdados

Asia/Kabul ou Asia/Tehran fusos horários?

Você relatou obter um valor da hora do dia de 22:30 em vez das 18:00 vistas aqui. Suspeito que o seu utilitário PHP esteja implicitamente aplicando um fuso horário padrão para ajustar a partir do UTC. Meu valor aqui é UTC, representado pelo Z(abreviado para Zulu, significa UTC). Alguma chance de seu sistema operacional ou PHP da máquina estar definido como Asia/Kabulou Asia/Tehranfusos horários? Suponho que sim, como você relata IRSTem sua produção, o que aparentemente significa tempo no Irã. Atualmente, em 2017, essas são as únicas zonas operam com um horário de verão quatro horas e meia antes do UTC.

Especifique um nome próprio fuso horário no formato continent/region, como America/Montreal, Africa/Casablanca, ou Pacific/Auckland. Nunca use a abreviação de 3-4 letras, como ESTou ISTou IRSTcomo elas não são zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).

Se você quiser ver seu momento pelas lentes do fuso horário de uma região específica, aplique a ZoneIdpara obter a ZonedDateTime. Ainda é o mesmo momento simultâneo, mas visto como uma hora diferente do relógio de parede .

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 [Ásia / Teerã]

Convertendo de java.time para classes herdadas

Você deve ficar com as novas classes java.time. Mas você pode converter para antigo, se necessário.

java.util.Date date = java.util.Date.from( instant );

Joda-Time

ATUALIZAÇÃO: O projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para o java.time classes .

Para sua informação, o construtor de um Joda-Time DateTime é semelhante: multiplique por mil para produzir um long(não um int!).

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

É melhor evitar as classes java.util.Date e .Calendar notoriamente problemáticas. Mas se você precisar usar uma Data, poderá converter do Joda-Time.

java.util.Date date = dateTime.toDate();

Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date, Calendar, e SimpleDateFormat.

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .

Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de java.sql.*classes.

Onde obter as classes java.time?

  • Java SE 8 , Java SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação em pacote configurável.
    • O Java 9 adiciona alguns recursos e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações de pacote configurável do Android das classes java.time.
    • Para anteriormente Android (<26), o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte
11

O construtor da data espera que o valor timeStamp esteja em milissegundos. Multiplique o valor do seu registro de data e hora com 1000, depois passe para o construtor.

f1sh
fonte
7

Se você estiver convertendo um valor de carimbo de data / hora em uma máquina diferente, verifique também o fuso horário dessa máquina. Por exemplo;

As descrições acima resultarão em valores diferentes de data, se você executar com fusos horários EST ou UTC.

Para definir o fuso horário; também conhecido como UTC, você pode simplesmente reescrever;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
tmr
fonte
6
Eu não recomendaria isso porque isso define o fuso horário de toda a jvm e não apenas o processo de análise!
1

For kotlin

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}
Arda Kazancı
fonte
0

Às vezes você precisa trabalhar com ajustes.

Não use elenco por muito tempo! Use nanoadjustment.

Por exemplo, usando a API Oanda Java para negociação, você pode obter data e hora no formato UNIX.

Por exemplo: 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

você obtém:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

Além disso, use:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );
Damir Isanbirdin
fonte
-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
Masatsugu Hosoi
fonte
3
Sem mais texto, não está claro por que essa resposta é preferível a muitas outras nesta pergunta. Você pode esclarecer por favor?
Duncan Jones
Isso modificará a data em vez de convertê-la!
backslashN