Java finalmente possui uma maneira intuitiva e confiável de trabalhar com datas e horas. Os princípios de data e hora são fundamentais em muitas aplicações. Várias coisas, como datas de nascimento, datas de aluguel, horários de eventos e horários de funcionamento da loja, são todas baseadas em datas e horários, mas o Java SE não forneceu uma maneira conveniente de trabalhar com eles. A partir do Java SE 8 , havia um conjunto de pacotes java.time - que fornecem uma API bem estruturada para trabalhar com datas e horas.
Aqui está uma pequena lista de problemas existentes em sua implementação:
Fundo
Quando o Java foi lançado, na versão 1.0 , a única classe para trabalhar com datas e horas era java.util.Date . A primeira coisa que os desenvolvedores notaram foi que não representa uma “data”. Na verdade, representa um momento no tempo, com precisão de milissegundos, medido a partir da data de 1º de janeiro de 1970. No entanto, com base no fato de que o método toString() de Date exibe a data e a hora no fuso horário especificado nas configurações java da máquina , alguns desenvolvedores concluíram erroneamente que Date pode funcionar com fusos horários. Consertar essa classe acabou sendo tão difícil (ou tão preguiçoso) que na versão 1.1 tivemos que adicionar uma nova classe - java.util.Calendar . Infelizmente, a classe Calendar acabou não sendo muito melhor que Date .- Mutável. Aulas como data e hora devem ser imutáveis.
- Compensações. Os anos em Data começam em 1900, os meses em ambas as classes começam em zero.
- Nomes. A data não é realmente uma "data" e o Calendário não é um calendário.
- Formatação. A formatação funciona apenas com Data, não com Calendário, e não é thread-safe.
Análise
A nova API java.time contém 5 pacotes:- java.time – o pacote base contendo objetos para armazenar valores
- java.time.chrono - fornece acesso a diferentes calendários
- java.time.format - formatação e reconhecimento de data e hora
- java.time.temporal – bibliotecas de baixo nível e funcionalidades avançadas
- java.time.zone - classes para trabalhar com fusos horários
datas
A classe LocalDate é uma das mais importantes da nova API . Ele contém um valor imutável que representa uma data. Você não pode definir a hora ou o fuso horário. O nome "local" pode ser familiar para você no Joda-Time e vem originalmente do padrão ISO-8601 . Significa precisamente a ausência de fuso horário. Essencialmente, LocalDate é a descrição de uma data, como “5 de abril de 2014”. A hora real desta data será diferente dependendo do seu fuso horário. Por exemplo, na Austrália esta data será 10 horas mais cedo do que em Londres e 18 horas mais cedo do que em São Francisco. A classe LocalDate possui todos os métodos comumente necessários:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
Em nosso exemplo, vemos uma data criada usando um método de fábrica (todos os construtores são privados). Em seguida, pedimos alguns dados ao objeto. Observe que
as enumerações Month e
DayOfWeek foram projetadas para tornar o código mais legível e confiável. No exemplo a seguir veremos como modificar a data. Como a classe é imutável, o resultado serão novos objetos, mas o original permanecerá como estava.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Estas são alterações relativamente simples, mas muitas vezes você precisa fazer modificações de datas mais complexas. Existe um mecanismo especial para isso na
API java.time - TemporalAdjuster . O seu objetivo é fornecer uma ferramenta integrada que permita manipular datas, por exemplo obtendo um objeto correspondente ao último dia do mês. Alguns deles estão incluídos na
API , mas você pode adicionar os seus próprios. Usar modificadores é muito fácil, mas requer importações estáticas:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
Usar modificadores simplifica muito seu código. Ninguém quer ver muita manipulação manual de datas. Se algum tipo de manipulação de data ocorrer diversas vezes em seu projeto, escreva seu próprio modificador e sua equipe poderá utilizá-lo como um componente já escrito e testado.
GO TO FULL VERSION