CodeGym /Cursos /JAVA 25 SELF /LocalDate, LocalTime, LocalDateTime

LocalDate, LocalTime, LocalDateTime

JAVA 25 SELF
Nível 13 , Lição 2
Disponível

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).

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION