1. LocalDate: data senza ora e fuso orario
LocalDate è semplicemente una data. Senza ora, senza fuso orario, senza complicazioni. Come una pagina del calendario: 2025-06-01 — e basta. Se non vi importa esattamente quando scocca «la mezzanotte» in città diverse e vi serve semplicemente «1 giugno 2025», usate LocalDate.
Come creare LocalDate?
Ci sono diversi modi, tutti semplici e comodi.
Data corrente
import java.time.LocalDate;
LocalDate today = LocalDate.now();
System.out.println(today); // Ad esempio, 2025-06-01
Data specifica
LocalDate birthday = LocalDate.of(1990, 12, 15);
System.out.println(birthday); // 1990-12-15
Si possono usare numeri per anno, mese e giorno. Il mese è un numero da 1 a 12 (gennaio — 1, dicembre — 12).
Parsing da stringa
LocalDate parsedDate = LocalDate.parse("2025-06-01");
System.out.println(parsedDate); // 2025-06-01
La stringa deve essere nel formato yyyy-MM-dd. Se il formato non corrisponde, verrà generata un'eccezione.
Ottenere i componenti della data
LocalDate ha metodi che restituiscono le singole parti della data:
int year = today.getYear(); // 2025
int month = today.getMonthValue(); // 6 (giugno)
int day = today.getDayOfMonth(); // 1
System.out.println("Anno: " + year + ", mese: " + month + ", giorno: " + day);
Se volete sapere il mese in lettere, usate il metodo getMonth():
System.out.println(today.getMonth()); // JUNE
E se vi serve il giorno della settimana — il metodo getDayOfWeek():
System.out.println(today.getDayOfWeek()); // SATURDAY
Esempio pratico
Continuiamo a sviluppare la tua applicazione console didattica: ora può fare gli auguri di compleanno all’utente.
import java.time.LocalDate;
public class BirthdayApp {
public static void main(String[] args) {
LocalDate birthday = LocalDate.of(2000, 2, 29);
System.out.println("Data di nascita: " + birthday);
System.out.println("Giorno della settimana di nascita: " + birthday.getDayOfWeek());
}
}
2. LocalTime: ora senza data e fuso orario
LocalTime è semplicemente l’ora. Ore, minuti, secondi (e persino nanosecondi). Ma senza data! Se serve memorizzare, per esempio, «l’orario di apertura del negozio» o «l’orario di inizio di una riunione» senza legarlo a una data, questa è la classe giusta.
Come creare LocalTime?
Ora corrente
import java.time.LocalTime;
LocalTime now = LocalTime.now();
System.out.println(now); // Ad esempio, 14:37:12.123456789
Ora specifica
LocalTime lunchTime = LocalTime.of(13, 30); // 13:30:00
System.out.println(lunchTime);
Si possono aggiungere secondi e nanosecondi:
LocalTime precise = LocalTime.of(8, 15, 30, 123_000_000); // 08:15:30.123
System.out.println(precise);
Parsing da stringa
LocalTime parsedTime = LocalTime.parse("14:30:00");
System.out.println(parsedTime); // 14:30
Ottenere i componenti dell'ora
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("Ore: " + hour + ", minuti: " + minute + ", secondi: " + second);
Esempio pratico
Aggiungiamo un «orologio» alla nostra applicazione:
import java.time.LocalTime;
public class ClockApp {
public static void main(String[] args) {
LocalTime current = LocalTime.now();
System.out.println("Adesso: " + current);
System.out.println("Ora: " + current.getHour());
System.out.println("Minuto: " + current.getMinute());
}
}
3. LocalDateTime: data e ora senza fuso orario
LocalDateTime è una combo: data + ora, ma ancora senza fuso orario. Per esempio, «2025-06-01 14:30:00». È comodo quando volete memorizzare un momento, ma non vi interessa dove nel mondo verrà letto.
Come creare LocalDateTime?
Data e ora correnti
import java.time.LocalDateTime;
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // Ad esempio, 2025-06-01T14:30:15.123456789
Data e ora specifiche
LocalDateTime meeting = LocalDateTime.of(2025, 6, 1, 14, 30);
System.out.println(meeting); // 2025-06-01T14:30
Si possono aggiungere secondi e nanosecondi:
LocalDateTime preciseMeeting = LocalDateTime.of(2025, 6, 1, 14, 30, 45, 123_000_000);
System.out.println(preciseMeeting); // 2025-06-01T14:30:45.123
Parsing da stringa
LocalDateTime parsed = LocalDateTime.parse("2025-06-01T14:30:00");
System.out.println(parsed); // 2025-06-01T14:30
Nota: la lettera T separa la data dall’ora secondo lo standard ISO.
Ottenere i componenti
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 + " Ora: " + hour + ":" + minute);
4. Operazioni tipiche con data e ora
Ora che sappiamo creare oggetti data e ora, impariamo a farci qualcosa di utile.
Addizione e sottrazione
Tutte e tre le classi (LocalDate, LocalTime, LocalDateTime) sono immutabili. Significa che metodi come plusDays() o minusMonths() restituiscono un nuovo oggetto senza modificare l’originale.
LocalDate
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate lastMonth = today.minusMonths(1);
System.out.println("Oggi: " + today);
System.out.println("Domani: " + tomorrow);
System.out.println("Un mese fa: " + lastMonth);
LocalTime
LocalTime now = LocalTime.now();
LocalTime inTenMinutes = now.plusMinutes(10);
System.out.println("Adesso: " + now);
System.out.println("Tra 10 minuti: " + inTenMinutes);
LocalDateTime
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = start.plusHours(2).minusMinutes(15);
System.out.println("Inizio: " + start);
System.out.println("Fine: " + end);
Confronto di date e ore
Tutte le classi hanno i metodi isBefore(), isAfter(), isEqual():
LocalDate birthday = LocalDate.of(2000, 2, 29);
LocalDate today = LocalDate.now();
if (today.isAfter(birthday)) {
System.out.println("Sei più vecchio di chi è appena nato!");
}
LocalTime morning = LocalTime.of(8, 0);
LocalTime now = LocalTime.now();
if (now.isBefore(morning)) {
System.out.println("È ancora presto per alzarsi...");
} else {
System.out.println("È ora di svegliarsi!");
}
Ottenere la data/ora correnti
Come avete già visto, i metodi now() restituiscono i valori correnti:
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
5. Pratica: esempi ed esercizi
Esempio 1: giorno della settimana per qualsiasi data
import java.time.LocalDate;
public class DayOfWeekApp {
public static void main(String[] args) {
LocalDate anyDate = LocalDate.of(2025, 12, 31);
System.out.println("Il 31 dicembre 2025 è " + anyDate.getDayOfWeek());
}
}
Esempio 2: Quanti giorni mancano al Capodanno?
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("Fino al Capodanno mancano " + daysLeft + " giorni!");
}
}
Esempio 3: Verificare se un anno è bisestile
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() + " — è un anno bisestile!");
} else {
System.out.println(date.getYear() + " — è un anno comune.");
}
}
}
Esempio 4: Differenza tra due orari
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("La giornata lavorativa dura " + duration.toHours() + " ore " +
(duration.toMinutes() % 60) + " minuti.");
}
}
6. Errori tipici
Errore n. 1: confondere LocalDateTime e ZonedDateTime.
LocalDateTime non contiene informazioni sul fuso orario! Se memorizzate orari di voli tra paesi o eventi che avvengono in zone diverse — usate ZonedDateTime, altrimenti potete ottenere risultati inattesi quando si trasferiscono i dati tra sistemi.
Errore n. 2: usare un formato di stringa errato per il parsing.
Ad esempio, si prova a fare il parsing di 01.06.2025 con LocalDate.parse(). Per impostazione predefinita ci si aspetta il formato 2025-06-01. Per altri formati serve uno specifico DateTimeFormatter (ne parleremo nella prossima lezione!).
Errore n. 3: pensare che metodi come plusDays() modifichino l'oggetto.
No! Tutti gli oggetti sono immutabili. Il metodo restituisce un nuovo oggetto e quello vecchio rimane invariato.
Errore n. 4: usare LocalTime per memorizzare un istante assoluto.
LocalTime è solo per l’ora locale del giorno. Se volete salvare un «momento nel tempo», usate Instant o ZonedDateTime.
Errore n. 5: dimenticare la numerazione dei mesi (1 — gennaio, 12 — dicembre).
In LocalDate.of(year, month, day) i mesi partono da 1 (e non da 0, come in alcuni altri linguaggi o vecchie API).
GO TO FULL VERSION