Trabalhar com data e hora é fundamental em muitos sistemas e aplicações. No Java, temos diversas classes e métodos que nos permitem manipular data e hora de forma simples e eficiente.
O Java possui uma extensa biblioteca de classes para manipulação de datas. Porém a partir do Java 8, a API de datas foi reestruturada e simplificada. A nova API de datas é baseada no JSR 310, que é um padrão para manipulação de datas e horas. A nova API de data está disponível no pacote java.time e possui classes para representar datas, horas, intervalos de tempo, etc.
Neste post, vamos aprender como trabalhar com a API de data e hora do Java, utilizando as classes LocalDate, LocalTime, LocalDateTime e ZonedDateTime.
Formação Desenvolvedor Java
Conhecer a formaçãoTrabalhando somente com a data no Java
import java.time.LocalDate;
public class ExemploData {
public static void main(String[] args) {
/*
* Para trabalharmos com datas, devemos utilizar a classe LocalDate.
* Esta classe representa uma data, sem hora, minuto, segundo, etc.
* O método estático now() retorna a data atual.
*/
var dataAtual = LocalDate.now();
System.out.println("Data atual: " + dataAtual); // 2023-06-22
/*
* Para criar uma data específica, devemos utilizar o método estático
* of() da classe LocalDate. Este método recebe três parâmetros:
* ano, mês e dia.
*/
var dataEspecifica = LocalDate.of(2019, 10, 10);
System.out.println("Data específica: " + dataEspecifica); // 2019-10-10
/*
* Podemos realizar manipulações com datas, como por exemplo, adicionar
* ou subtrair dias, meses ou anos. Com os métodos plusDays(), plusMonths(),
* plusYears(), minusDays(), minusMonths() e minusYears().
*/
var dataAlterada = dataEspecifica.plusDays(10);
System.out.println("Data alterada: " + dataAlterada); // 2019-10-20
}
}
Trabalhando somente com a hora no Java
import java.time.LocalTime;
public class ExemploTempo {
public static void main(String[] args) {
/*
* Para trabalharmos com horas, devemos utilizar a classe LocalTime.
* Esta classe representa uma hora, sem data, mês, ano, etc.
* O método estático now() retorna a hora atual.
*/
var horaAtual = LocalTime.now();
System.out.println("Hora atual: " + horaAtual); // 14:02:10
/*
* Para criar uma hora específica, devemos utilizar o método estático
* of() da classe LocalTime. Este método recebe três parâmetros:
* hora, minuto e segundo.
*/
var horaEspecifica = LocalTime.of(10, 10, 10);
System.out.println("Hora específica: " + horaEspecifica); // 10:10:10
/*
* Podemos realizar manipulações com horas, como por exemplo, adicionar
* ou subtrair horas, minutos ou segundos. Com os métodos plusHours(),
* plusMinutes(), plusSeconds(), minusHours(), minusMinutes() e
* minusSeconds().
*/
var horaAlterada = horaEspecifica.plusHours(10);
System.out.println("Hora alterada: " + horaAlterada); // 20:10:10
}
}
Trabalhando com a data e hora no Java
import java.time.LocalDateTime;
public class ExemploDataHora {
public static void main(String[] args) {
/*
* Para trabalharmos com datas e horas, devemos utilizar a classe
* LocalDateTime. Esta classe representa uma data e hora, sem timezone.
* O método estático now() retorna a data e hora atual.
*/
var dataHoraAtual = LocalDateTime.now();
System.out.println("Data e hora atual: " + dataHoraAtual); // 2023-06-22T14:02:10
/*
* Para criar uma data e hora específica, devemos utilizar o método
* estático of() da classe LocalDateTime. Este método recebe seis
* parâmetros: ano, mês, dia, hora, minuto e segundo.
*/
var dataHoraEspecifica = LocalDateTime.of(2019, 10, 10, 10, 10, 10);
System.out.println("Data e hora específica: " + dataHoraEspecifica); // 2019-10-10T10:10:10
/*
* Podemos realizar manipulações com datas e horas, como por exemplo,
* adicionar ou subtrair dias, meses, anos, horas, minutos ou segundos.
* Com os métodos plusDays(), plusMonths(), plusYears(), plusHours(),
* plusMinutes(), plusSeconds(), minusDays(), minusMonths(), minusYears(),
* minusHours(), minusMinutes() e minusSeconds().
*/
var dataHoraAlterada = dataHoraEspecifica.plusDays(10);
System.out.println("Data e hora alterada: " + dataHoraAlterada); // 2019-10-20T10:10:10
}
}
Formatando data e hora no Java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class ExemploFomatarDataHora {
public static void main(String[] args) {
/*
* Também é possível formatar a data e hora de acordo com o padrão
* informado, utilizando a classe DateTimeFormatter. Esta classe possui um método
* estático para formatar a data e hora.
* Primeiro, devemos criar um objeto da classe DateTimeFormatter
* informando o padrão que desejamos utilizar para formatar a data e hora.
*/
var formatador = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
/*
* Depois, devemos utilizar o método format() da classe DateTimeFormatter
* para formatar a data e hora. Este método recebe um objeto da classe
* LocalDateTime ou LocalDate ou LocalTime e retorna uma String com a data
* e hora formatada.
*/
var dataHora = LocalDateTime.of(2019, 10, 10, 10, 10, 10);
var dataHoraFormatada = formatador.format(dataHora);
System.out.println("Data e hora formatada: " + dataHoraFormatada); // 10/10/2019 10:10:10
}
}
Trabalhando com timezone no Java
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class ExemploDataHoraComTimezone {
public static void main(String[] args) {
/*
* Também é possível trabalhar com timezone utilizando a classe
* ZonedDateTime. Esta classe representa uma data e hora, com timezone.
* O método estático now() retorna a data e hora atual. O timezone
* utilizado é o timezone padrão do sistema operacional.
*/
var dataHoraAtual = ZonedDateTime.now(); // 2023-06-22T14:02:10-03:00[America/Fortaleza]
System.out.println(dataHoraAtual);
/*
* Para criar uma data e hora específica, devemos utilizar o método
* estático of() da classe ZonedDateTime. Este método recebe sete
* parâmetros: ano, mês, dia, hora, minuto, segundo e timezone.
* O timezone deve ser informado utilizando a classe ZoneId.
*/
var timezone = ZoneId.of("America/Sao_Paulo");
var dataHoraEspecifica = ZonedDateTime.of(2019, 10, 10, 10, 10, 10, 0, timezone);
System.out.println(dataHoraEspecifica); // 2019-10-10T10:10:10-03:00[America/Sao_Paulo]
/*
* Podemos converter uma data e hora de um timezone para outro utilizando
* o método withZoneSameInstant().
*/
var dataHoraAlterada = dataHoraEspecifica.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(dataHoraAlterada); // 2019-10-10T09:10:10-04:00[America/New_York]
/*
* Podemos obter o timezone do sistema utilizando o método estático
* systemDefault() da classe ZoneId.
*/
var timezoneSistema = ZoneId.systemDefault();
System.out.println(timezoneSistema); // America/Fortaleza
}
}