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 Calendar
o 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.time
pacote é o pacote base para a API Java Date Time: ele contém classes como LocalDate
, LocalTime
, LocalDateTime
, Instant
, Period
e 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.format
pacote 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 DateTimeFormatter
classe versátil, que substitui a SimpleDateFormat
classe.
O java.time.zone
pacote contém classes para trabalhar com fusos horários. Ele contém classes como TimeZone
e ZonedDateTime
. Se você estiver escrevendo código de servidor para clientes localizados em diferentes partes do mundo, realmente precisará dessas classes.
2. LocalDate
classe
A primeira e mais útil classe da API Date Time que veremos é a LocalDate
classe. 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 LocalDate
classe é 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 LocalDate
objeto, 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 LocalDate
variável e LocalDate.now()
é uma chamada para o now()
método estático da LocalDate
classe.
Exemplo:
Código | Saída do console |
---|---|
|
|
Obter uma data em um fuso horário específico
A LocalDate
classe 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 ZoneId
classe (java.time.ZoneId). Possui um of()
método que retorna um ZoneId
objeto 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 LocalDate
objeto 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 LocalDate
variável e é uma chamada para o método estático da classe.LocalDate.of()
of()
LocalDate
Aqui vemos a FEBRUARY
constante da Month
classe (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 ofYearDay
mé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 Date
os 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 LocalDate
classe 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 LocalDate
objetos, mas você pode obter elementos individuais da data armazenada. LocalDate
objetos 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 LocalDate
objeto
A LocalDate
classe contém vários métodos que permitem trabalhar com datas. A implementação desses métodos é análoga aos métodos da String
classe: eles não alteram o LocalDate
objeto existente, mas retornam um novo com os dados desejados.
Aqui estão os métodos da LocalDate
classe:
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 object
mé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