Definir o fuso horário de uma data em Java

Definir o fuso horário de uma data em Java

1. Visão geral

Neste tutorial rápido, veremos como definir o fuso horário de uma data usando Java 7, Java 8 e a biblioteca Joda-Time.

2. Usando Java 8

Java 8 introduziua new Date-Time API para trabalhar com datas e horas que eram amplamente baseadas na biblioteca Joda-Time.

A classeInstant da API Java Date Time modela um único ponto instantâneo na linha do tempo em UTC. Isso representa a contagem de nanossegundos desde a época do primeiro momento de 1970 UTC.

Primeiro, obteremos oInstant atual do relógio do sistema eZoneId para um nome de fuso horário:

Instant nowUtc = Instant.now();
ZoneId asiaSingapore = ZoneId.of("Asia/Singapore");

Finalmente,ZoneIdeInstant podem ser utilizados para criar um objeto de data e hora com detalhes de fuso horário. A classeZonedDateTime representa uma data e hora com um fuso horário no sistema de calendário ISO-8601:

ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);

UsamosZonedDateTime do Java 8 para representar uma data e hora com um fuso horário.

3. Usando Java 7

No Java 7, definir o fuso horário é um pouco complicado. A classeDate (que representa um instante específico no tempo) não contém nenhuma informação de fuso horário.

Primeiro, vamos obter a data UTC atual e um objetoTimeZone:

Date nowUtc = new Date();
TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);

No Java 7, precisamos usar a classeCalendar para representar uma data com um fuso horário.

Finalmente, podemos criar umnowUtc Calendar comasiaSingapore TimeZonee definir o tempo:

Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore);
nowAsiaSingapore.setTime(nowUtc);

É recomendável evitar a API de data e hora do Java 7 em favor da API de data e hora do Java 8 ou a biblioteca Joda-Time.

4. Usando Joda-Time

Se o Java 8 não for uma opção,we can still get the same kind of result from Joda-Time, um padrão de fato para operações de data e hora no mundo pré-Java 8.

Primeiro, precisamos adicionarJoda-Time dependency apom.xml:


  joda-time
  joda-time
  2.10

Para representar um ponto exato na linha do tempo, podemos usar o pacoteInstant fromorg.joda.time. Internamente, a classe mantém um dado, o instante em milissegundos da época do Java de 1970-01-01T00: 00: 00Z:

Instant nowUtc = Instant.now();

UsaremosDateTimeZone para representar um fuso horário (para o id de fuso horário especificado):

DateTimeZone asiaSingapore = DateTimeZone.forID("Asia/Singapore");

Agora, o temponowUtc será convertido em um objetoDateTime usando as informações de fuso horário:

DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);

É assim que a API do Joda-time pode ser usada para combinar informações de data e fuso horário.

5. Conclusão

Neste artigo, descobrimos como definir o fuso horário em Java usando Java 7, 8 e Joda-Time API. Para saber mais sobre o suporte de data e hora do Java 8, verifiqueour Java 8 date-time intro.

Como sempre, o snippet de código está disponível emGitHub repository.