Ce face ZonedDateTime
ZonedDateTime este un LocalDateTime plus un fus orar (ZoneId) și diferența față de UTC în acel moment (+03:00 vara, +02:00 iarna, pentru România). Spre deosebire de LocalDateTime, indică un singur moment pe tot globul.
ZonedDateTime.now() dă momentul curent în fusul orar al sistemului, iar now(ZoneId.of("Europe/London")) în fusul ales. ZonedDateTime.of(...) creează un moment fix, din numere sau dintr-un LocalDateTime existent.
Calculele țin cont de ora de vară. În România, în ultima duminică din octombrie, ceasul se dă înapoi de la 04:00 la 03:00, deci acea zi are 25 de ore. toString() arată formatul 2026-10-19T14:30+03:00[Europe/Bucharest].
Parametri
| Parametru | Descriere |
|---|---|
an … nano |
Data și ora locală în acel fus orar. |
zona |
Fusul orar: ZoneId.of("Europe/Bucharest"), ZoneId.of("UTC") etc. |
dataOra |
Un LocalDateTime căruia i se atașează fusul orar. |
Ce returnează
Un ZonedDateTime.
Exemple
Exemplul 1: Momentul curent în mai multe orașe
Rezultatul depinde de momentul rulării.
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime acum = ZonedDateTime.now(ZoneId.of("Europe/Bucharest"));
System.out.println("București: " + acum);
System.out.println("Londra: " + ZonedDateTime.now(ZoneId.of("Europe/London")));
}
}
Rezultat posibil (diferă la fiecare rulare)
București: 2026-10-19T14:31:07.482915+03:00[Europe/Bucharest]
Londra: 2026-10-19T12:31:07.483102+01:00[Europe/London]
Exemplul 2: Un moment fix, vara și iarna
Diferența față de UTC se schimbă singură după data aleasă.
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZoneId bucuresti = ZoneId.of("Europe/Bucharest");
ZonedDateTime vara = ZonedDateTime.of(2026, 7, 15, 10, 0, 0, 0, bucuresti);
ZonedDateTime iarna = ZonedDateTime.of(LocalDateTime.of(2026, 12, 15, 10, 0), bucuresti);
System.out.println("Vara: " + vara + " diferență " + vara.getOffset());
System.out.println("Iarna: " + iarna + " diferență " + iarna.getOffset());
}
}
Rezultat
Vara: 2026-07-15T10:00+03:00[Europe/Bucharest] diferență +03:00
Iarna: 2026-12-15T10:00+02:00[Europe/Bucharest] diferență +02:00
Exemplul 3: Ziua cu 25 de ore
Pe 25 octombrie 2026 ora de vară se termină. De la miezul nopții la miezul nopții trec 25 de ore reale.
import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZoneId bucuresti = ZoneId.of("Europe/Bucharest");
ZonedDateTime inceput = ZonedDateTime.of(2026, 10, 25, 0, 0, 0, 0, bucuresti);
ZonedDateTime sfarsit = inceput.plusDays(1);
System.out.println(inceput + " -> " + sfarsit);
System.out.println("Ore în acea zi: " + Duration.between(inceput, sfarsit).toHours());
System.out.println("03:30 + 1 oră = " + inceput.withHour(3).withMinute(30).plusHours(1));
}
}
Rezultat
2026-10-25T00:00+03:00[Europe/Bucharest] -> 2026-10-26T00:00+02:00[Europe/Bucharest]
Ore în acea zi: 25
03:30 + 1 oră = 2026-10-25T03:30+02:00[Europe/Bucharest]
Greșeli frecvente
- Folosești diferențe fixe (
ZoneOffset.of("+02:00")) pentru România. Vara diferența este +03:00; foloseșteZoneId.of("Europe/Bucharest"), care știe regulile. - Scrii fusuri prescurtate ca
"EET"sau"EEST". Folosește numele complete „Continent/Oraș”.
Comenzi înrudite
ZoneId: Identifică un fus orar (Europe/Bucharest) cu regulile lui de oră de vară; of îl alege, systemDefault dă fusul sistemului.ZonedDateTime.withZoneSameInstant: Convertește momentul în alt fus orar: același moment, altă oră pe ceas (14:00 la București = 12:00 la Londra).LocalDateTime: Data și ora împreună (2026-10-19T14:30), fără fus orar. LocalDateTime.now() dă momentul curent după ceasul local.Instant: Un moment exact pe axa timpului, în UTC, măsurat în secunde și nanosecunde de la 1 ianuarie 1970.Duration.between: Calculează timpul exact dintre două momente (ore, minute, secunde); negativ dacă sfârșitul e înaintea startului.