1. 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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
Retorna o ano de uma data específica |
|
Retorna o mês da data: uma das várias constantesJANUARY, FEBRUARY, ...; |
|
Retorna o índice do mês da data. janeiro == 1. |
|
Retorna o índice do dia do mês |
|
Retorna o índice do dia desde o início do ano |
|
Retorna o dia da semana: uma das várias constantesMONDAY, TUESDAY, ...; |
|
Retorna a era: ou BCE(Before Current Era) e CE(Current Era) |
Exemplo:
| Código | Saída do console |
|---|---|
|
|
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 |
|---|---|
|
Adiciona um número especificado de dias à data |
|
Adiciona semanas à data |
|
Adiciona meses à data |
|
Adiciona anos à data |
|
Subtrai dias da data |
|
Subtrai semanas da data |
|
Subtrai meses da data |
|
Subtrai anos da data |
Exemplo:
| Código | Saída do console |
|---|---|
|
|
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.
GO TO FULL VERSION