1. ZonedDateTime
aula
Existe outra classe muito interessante na API Date Time: a ZonedDateTime
classe. Seu principal objetivo é facilitar o trabalho com datas em diferentes fusos horários.
LocalDate
é ótimo para representar datas. Por exemplo, aniversários. Meu aniversário é dia 15 de março, não importa onde eu esteja. Este é um exemplo de data.
LocalTime
é ótimo para descrever o tempo, como o horário definido em um despertador: eu coloco o alarme para as 5h e não importa onde estou. 5:00 da manhã é 5:00 da manhã. Este é um exemplo de trabalho com o tempo.
Agora, digamos que estamos escrevendo um aplicativo que reserva voos. Os aviões decolam e chegam com base no horário local. O avião fica no ar por um tempo fixo, mas os fusos horários podem mudar.
Fusos horários
A propósito, os fusos horários são uma verdadeira bagunça. E se você pensa que existem 24 fusos horários, está muito enganado.
Por exemplo, o horário na Índia difere do horário de Greenwich em cinco horas e meia: GMT+5:30
. Alguns países mudam para o horário de verão e outros não. Além disso, diferentes países mudam para o horário de verão em diferentes épocas do ano.
E alguns países aprovam leis que cancelam o horário de verão, ou o reintroduzem, ou o cancelam novamente.
De qualquer forma, o mundo tem fusos horários e dentro de cada fuso horário existe uma hora. O horário em diferentes zonas pode coincidir durante determinados períodos do ano e diferir em outros períodos. Os fusos horários geralmente recebem o nome das principais cidades localizadas neles: Europe/Monaco
, Asia/Singapore
, mas também há exceções - US/Pacific
.
Oficialmente, existem 599 fusos horários no momento. Pense nisso: 599. Está longe de ser 24. Bem-vindo ao mundo global.
A ZoneId
classe do java.time
pacote é usada para armazenar um fuso horário em Java.
A propósito, ele possui um getAvailableZoneIds()
método estático, que retorna o conjunto de todos os fusos horários conhecidos atualmente. Para obter uma lista de todas as zonas, você precisa escrever o seguinte código:
Código | Saída do console (parcial) |
---|---|
|
|
Para obter um ZoneId
objeto pelo nome, você precisa usar o of()
método estático;
Código | Observação |
---|---|
|
|
2. Criando um ZonedDateTime
objeto
Ao criar um ZonedDateTime
objeto, você precisa chamar o now()
método estático da classe e passar um ZoneId
objeto para ele.
Código | Saída do console |
---|---|
|
|
Se você não passar um ZoneId
objeto para o now()
método (e isso é permitido), o fuso horário é determinado automaticamente com base nas configurações do computador que está executando o programa.
Exemplo:
Código | Saída do console |
---|---|
|
|
Convertendo uma data global em uma local
Uma das características interessantes do ZonedDateTime
é sua capacidade de converter para uma data e hora locais. Exemplo:
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);
LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();
3. Trabalhando com o tempo
Como a LocalDateTime
classe, a ZonedDateTime
classe tem várias maneiras de obter elementos individuais de uma data e hora. Aqui está uma lista desses métodos:
|
Retorna o ano de uma data específica |
|
Retorna o mês da data: uma das várias constantes —JANUARY, FEBRUARY, ...; |
|
Retorna o índice do mês da data. janeiro == 1 |
|
Retorna o índice do dia do mês |
|
Retorna o dia da semana: uma das várias constantes —MONDAY, TUESDAY, ...; |
|
Retorna o índice do dia do ano |
|
Retorna as horas |
|
Retorna os minutos |
|
Retorna os segundos |
|
Retorna os nanossegundos |
Todos os métodos são perfeitamente análogos aos métodos da LocalDateTime
classe. E, claro, a ZonedDateTime
classe tem métodos que permitem trabalhar com datas e horas. Dito isso, o objeto no qual os métodos são chamados não muda. Em vez disso, eles retornam um novo ZonedDateTime
objeto:
Métodos | Descrição |
---|---|
|
Adiciona anos à data |
|
Adiciona meses à data |
|
Adiciona dias à data |
|
Adiciona horas |
|
Adiciona minutos |
|
Adiciona segundos |
|
Adiciona nanossegundos |
|
Subtrai anos da data |
|
Subtrai meses da data |
|
Subtrai dias da data |
|
Subtrai horas |
|
Subtrai minutos |
|
Subtrai segundos |
|
Subtrai nanossegundos |
Não daremos exemplos, pois pensamos que tudo aqui é claro por analogia com as classes que acabamos de considerar.
GO TO FULL VERSION