1. Apresentando a API de data e hora

Apresentando a API de data e hora

Os criadores de Java não gostaram da situação com as classes Date e Calendar. Eles eram bons em seus dias, mas os tempos mudam. E algo simples, poderoso e confiável tornou-se necessário. E com o lançamento do Java 8 (15 anos após Calendaro surgimento), a API Java Date Time foi introduzida. É um conjunto de classes que deve ser capaz de resolver todas as tarefas possíveis relacionadas ao tempo.

Eram tantas classes que foram divididas em vários pacotes:

O java.timepacote é o pacote base para a API Java Date Time: ele contém classes como LocalDate, LocalTime, LocalDateTime, Instant, Periode Duration. Todos os objetos dessas classes são immutable, o que significa que não podem ser alterados após a criação.

O java.time.formatpacote contém classes para formatação de hora, ou seja, conversão de horas (e datas) em strings e vice-versa. Por exemplo, ele contém a DateTimeFormatterclasse versátil, que substitui a SimpleDateFormatclasse.

O java.time.zonepacote contém classes para trabalhar com fusos horários. Ele contém classes como TimeZonee ZonedDateTime. Se você estiver escrevendo código de servidor para clientes localizados em diferentes partes do mundo, realmente precisará dessas classes.


2. LocalDateclasse

A primeira e mais útil classe da API Date Time que veremos é a LocalDateclasse. Como você provavelmente pode adivinhar pelo nome, esta classe é projetada para trabalhar com datas.

Objetos desta classe não mudam após serem criados, ou seja, a LocalDateclasse é imutável. Mas essa propriedade adiciona simplicidade e confiabilidade à classe. Especialmente se vários threads (threads de execução) estiverem interagindo com tal objeto ao mesmo tempo.

Para criar um novo LocalDateobjeto, você precisa usar um dos métodos estáticos. Aqui está uma lista dos principais.

Obtendo a data atual

Para obter a data atual, você precisa usar o now()método estático. Isso é muito mais fácil do que parece:

LocalDate today = LocalDate.now();

Onde todayé uma LocalDatevariável e LocalDate.now()é uma chamada para o now()método estático da LocalDateclasse.

Exemplo:

Código Saída do console
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Obter uma data em um fuso horário específico

A LocalDateclasse também possui uma variação do now(ZoneId)método que permite obter a data atual em um fuso horário específico.

Para fazer isso, precisamos de outra classe — a ZoneIdclasse (java.time.ZoneId). Possui um of()método que retorna um ZoneIdobjeto dado o nome do fuso horário.

Para determinar a data atual em Xangai, você precisa escrever o seguinte código:

Código Saída do console
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Você pode encontrar uma lista dos nomes de todos os fusos horários na Internet.


3. Conseguir uma data específica

Para obter um LocalDateobjeto que representa uma data específica, você precisa usar o of()método estático. Tudo aqui também é muito simples e claro:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Onde dateé uma LocalDatevariável e é uma chamada para o método estático da classe.LocalDate.of()of()LocalDate

Aqui vemos a FEBRUARYconstante da Monthclasse (java.time.Month) sendo usada para especificar fevereiro como o mês.

Você também pode especificar o mês à moda antiga - usando um número:

LocalDate date = LocalDate.of(2019, 2, 22);

Dois? Em vez de fevereiro? Isso significa que os meses estão novamente sendo numerados a partir de um?

Sim, quase 20 anos após a criação do Java, os meses finalmente deixaram de ser contados a partir do zero.

Exemplo:

Código Saída do console
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Obtendo uma data pelo índice do dia

Existe outra maneira interessante de criar uma data: usando o ofYearDaymétodo, você pode obter uma data baseada apenas no número do ano e no índice do dia do ano. Aqui está a aparência geral:

LocalDate date = LocalDate.ofYearDay(year, day);

Onde yearé o número do ano e dayé o índice do dia no ano.

Exemplo:

Código Saída do console
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

O 100º dia de 2019 é 10 de abril.

Obtendo uma data Unix

Você se lembra que Dateos objetos sempre armazenaram o tempo como o número de milissegundos desde 1º de janeiro de 1970? Para garantir que os programadores não perderiam os bons velhos tempos, a LocalDateclasse ganhou um ofEpochDay()método, que retorna a data calculada a partir de 1º de janeiro de 1970. Aqui está a aparência geral:

LocalDate date = LocalDate.ofEpochDay(day);

Onde dayé o número de dias decorridos desde 1º de janeiro de 1970.

Exemplo:

Código Saída do console
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Obtendo elementos de uma data

É impossível alterar LocalDateobjetos, mas você pode obter elementos individuais da data armazenada. LocalDateobjetos têm vários métodos para isso:

Método Descrição
int getYear()
Retorna o ano de uma data específica
Month getMonth()
Retorna o mês da data: uma das várias constantes
JANUARY, FEBRUARY, ...;
int getMonthValue()
Retorna o índice do mês da data. janeiro == 1.
int getDayOfMonth()
Retorna o índice do dia do mês
int getDayOfYear()
Retorna o índice do dia desde o início do ano
DayOfWeek getDayOfWeek()
Retorna o dia da semana: uma das várias constantes
MONDAY, TUESDAY, ...;
IsoEra getEra()
Retorna a era: ou BCE(Before Current Era) e CE(Current Era)

Exemplo:

Código Saída do console
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Alterar a data em um LocalDateobjeto

A LocalDateclasse contém vários métodos que permitem trabalhar com datas. A implementação desses métodos é análoga aos métodos da Stringclasse: eles não alteram o LocalDateobjeto existente, mas retornam um novo com os dados desejados.

Aqui estão os métodos da LocalDateclasse:

Método Descrição
plusDays(int days)
Adiciona um número especificado de dias à data
plusWeeks(int weeks)
Adiciona semanas à data
plusMonths(int months)
Adiciona meses à data
plusYears(int years)
Adiciona anos à data
minusDays(int days)
Subtrai dias da data
minusWeeks(int weeks)
Subtrai semanas da data
minusMonths(int months)
Subtrai meses da data
minusYears(int years)
Subtrai anos da data

Exemplo:

Código Saída do console
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Os birthday objectmétodos who que chamamos não mudam. Em vez disso, seus métodos retornam novos objetos que contêm os dados desejados.