ZonedDateTime în Java

Data și ora împreună cu fusul orar (Europe/Bucharest); indică un moment exact și știe de ora de vară.

Sintaxă
import java.time.ZonedDateTime;

static ZonedDateTime now()
static ZonedDateTime now(ZoneId zona)
static ZonedDateTime of(int an, int luna, int zi, int ora, int minut, int secunda, int nano, ZoneId zona)
static ZonedDateTime of(LocalDateTime dataOra, ZoneId zona)

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ște ZoneId.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.