1. LocalDate: data sem hora e sem fuso horário
LocalDate — é apenas uma data. Sem hora, sem fuso horário, sem complicação. Como uma página do calendário: 2025-06-01 — e só. Se você não se importa com o momento exato em que “meia-noite” acontece em cidades diferentes e só precisa de “1º de junho de 2025” — use LocalDate.
Como criar um LocalDate?
Há várias maneiras, todas simples e práticas.
Data atual
import java.time.LocalDate;
LocalDate today = LocalDate.now();
System.out.println(today); // Por exemplo, 2025-06-01
Data específica
LocalDate birthday = LocalDate.of(1990, 12, 15);
System.out.println(birthday); // 1990-12-15
Você pode usar números para ano, mês e dia. O mês é um número de 1 a 12 (janeiro — 1, dezembro — 12).
Parse a partir de string
LocalDate parsedDate = LocalDate.parse("2025-06-01");
System.out.println(parsedDate); // 2025-06-01
A string deve estar no formato yyyy-MM-dd. Se o formato não corresponder, será lançada uma exceção.
Obtendo componentes da data
LocalDate tem métodos que retornam partes individuais da data:
int year = today.getYear(); // 2025
int month = today.getMonthValue(); // 6 (junho)
int day = today.getDayOfMonth(); // 1
System.out.println("Ano: " + year + ", mês: " + month + ", dia: " + day);
Se quiser o mês por extenso, use o método getMonth():
System.out.println(today.getMonth()); // JUNE
E se precisar do dia da semana — use o método getDayOfWeek():
System.out.println(today.getDayOfWeek()); // SATURDAY
Exemplo prático
Continuando a evoluir seu aplicativo de console de estudos: agora ele pode parabenizar o usuário pelo aniversário.
import java.time.LocalDate;
public class BirthdayApp {
public static void main(String[] args) {
LocalDate birthday = LocalDate.of(2000, 2, 29);
System.out.println("Data de nascimento: " + birthday);
System.out.println("Dia da semana do nascimento: " + birthday.getDayOfWeek());
}
}
2. LocalTime: hora sem data e sem fuso horário
LocalTime — é apenas a hora. Horas, minutos, segundos (e até nanossegundos). Mas sem data! Se você precisa armazenar, por exemplo, “horário de abertura da loja” ou “horário de início da reunião” sem vínculo a uma data — esta é a classe certa.
Como criar um LocalTime?
Hora atual
import java.time.LocalTime;
LocalTime now = LocalTime.now();
System.out.println(now); // Por exemplo, 14:37:12.123456789
Hora específica
LocalTime lunchTime = LocalTime.of(13, 30); // 13:30:00
System.out.println(lunchTime);
Você pode adicionar segundos e nanossegundos:
LocalTime precise = LocalTime.of(8, 15, 30, 123_000_000); // 08:15:30.123
System.out.println(precise);
Parse a partir de string
LocalTime parsedTime = LocalTime.parse("14:30:00");
System.out.println(parsedTime); // 14:30
Obtendo componentes do horário
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("Horas: " + hour + ", minutos: " + minute + ", segundos: " + second);
Exemplo prático
Vamos adicionar um “relógio” ao nosso aplicativo:
import java.time.LocalTime;
public class ClockApp {
public static void main(String[] args) {
LocalTime current = LocalTime.now();
System.out.println("Agora: " + current);
System.out.println("Hora: " + current.getHour());
System.out.println("Minuto: " + current.getMinute());
}
}
3. LocalDateTime: data e hora sem fuso horário
LocalDateTime — é um combo: data + hora, mas ainda sem fuso horário. Por exemplo, “2025-06-01 14:30:00”. É útil quando você quer armazenar um momento no tempo, mas não se importa onde no planeta ele será lido.
Como criar um LocalDateTime?
Data e hora atuais
import java.time.LocalDateTime;
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // Por exemplo, 2025-06-01T14:30:15.123456789
Data e hora específicas
LocalDateTime meeting = LocalDateTime.of(2025, 6, 1, 14, 30);
System.out.println(meeting); // 2025-06-01T14:30
Você pode adicionar segundos e nanossegundos:
LocalDateTime preciseMeeting = LocalDateTime.of(2025, 6, 1, 14, 30, 45, 123_000_000);
System.out.println(preciseMeeting); // 2025-06-01T14:30:45.123
Parse a partir de string
LocalDateTime parsed = LocalDateTime.parse("2025-06-01T14:30:00");
System.out.println(parsed); // 2025-06-01T14:30
Observe: a letra T separa a data da hora segundo o padrão ISO.
Obtendo componentes
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
System.out.println("Data: " + year + "-" + month + "-" + day + " Hora: " + hour + ":" + minute);
4. Operações típicas com data e hora
Agora que sabemos criar objetos de data e hora, vamos aprender a fazer algo útil com eles.
Adição e subtração
Todas as três classes (LocalDate, LocalTime, LocalDateTime) são imutáveis. Isso significa que métodos como plusDays() ou minusMonths() retornam um novo objeto, sem alterar o original.
LocalDate
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate lastMonth = today.minusMonths(1);
System.out.println("Hoje: " + today);
System.out.println("Amanhã: " + tomorrow);
System.out.println("Um mês atrás: " + lastMonth);
LocalTime
LocalTime now = LocalTime.now();
LocalTime inTenMinutes = now.plusMinutes(10);
System.out.println("Agora: " + now);
System.out.println("Daqui a 10 minutos: " + inTenMinutes);
LocalDateTime
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = start.plusHours(2).minusMinutes(15);
System.out.println("Início: " + start);
System.out.println("Fim: " + end);
Comparação de datas e horas
Todas as classes possuem os métodos isBefore(), isAfter(), isEqual():
LocalDate birthday = LocalDate.of(2000, 2, 29);
LocalDate today = LocalDate.now();
if (today.isAfter(birthday)) {
System.out.println("Você é mais velho do que quem acabou de nascer!");
}
LocalTime morning = LocalTime.of(8, 0);
LocalTime now = LocalTime.now();
if (now.isBefore(morning)) {
System.out.println("Ainda é cedo para levantar...");
} else {
System.out.println("Hora de acordar!");
}
Obtendo a data/hora atuais
Como você já viu, os métodos now() retornam os valores atuais:
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
5. Prática: exemplos e exercícios
Exemplo 1: Dia da semana para qualquer data
import java.time.LocalDate;
public class DayOfWeekApp {
public static void main(String[] args) {
LocalDate anyDate = LocalDate.of(2025, 12, 31);
System.out.println("31 de dezembro de 2025 — é " + anyDate.getDayOfWeek());
}
}
Exemplo 2: Quantos dias faltam para o Ano-Novo?
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DaysToNewYear {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate newYear = LocalDate.of(today.getYear() + 1, 1, 1);
long daysLeft = ChronoUnit.DAYS.between(today, newYear);
System.out.println("Faltam " + daysLeft + " dias para o Ano-Novo!");
}
}
Exemplo 3: Verificar se o ano é bissexto
import java.time.LocalDate;
public class LeapYearCheck {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 1, 1);
if (date.isLeapYear()) {
System.out.println(date.getYear() + " — é um ano bissexto!");
} else {
System.out.println(date.getYear() + " — é um ano comum.");
}
}
}
Exemplo 4: Diferença entre dois horários
import java.time.LocalTime;
import java.time.Duration;
public class TimeDifference {
public static void main(String[] args) {
LocalTime start = LocalTime.of(9, 0);
LocalTime end = LocalTime.of(17, 30);
Duration duration = Duration.between(start, end);
System.out.println("O expediente dura " + duration.toHours() + " horas " +
(duration.toMinutes() % 60) + " minutos.");
}
}
6. Erros comuns
Erro nº 1: Confundir LocalDateTime com ZonedDateTime.
LocalDateTime não contém informações de fuso horário! Se você armazena horários de voos entre países ou eventos que ocorrem em diferentes fusos — use ZonedDateTime; caso contrário, você pode obter resultados inesperados ao transferir dados entre sistemas.
Erro nº 2: Usar um formato de string incorreto para parsing.
Por exemplo, tentar fazer parse de 01.06.2025 com LocalDate.parse(). Por padrão, espera-se o formato 2025-06-01. Para outros formatos, é necessário um DateTimeFormatter específico (vamos falar sobre isso na próxima aula!).
Erro nº 3: Achar que métodos como plusDays() modificam o objeto.
Não! Todos os objetos são imutáveis. O método retorna um novo objeto, e o antigo permanece inalterado.
Erro nº 4: Usar LocalTime para armazenar um instante absoluto.
LocalTime — é apenas para o horário local do dia. Se você quer salvar um “instante no tempo”, use Instant ou ZonedDateTime.
Erro nº 5: Esquecer a numeração dos meses (1 — janeiro, 12 — dezembro).
Em LocalDate.of(year, month, day) os meses começam em 1 (e não em 0, como em algumas outras linguagens ou APIs antigas).
GO TO FULL VERSION