ZoneId în Java

Identifică un fus orar (Europe/Bucharest) cu regulile lui de oră de vară; of îl alege, systemDefault dă fusul sistemului.

Sintaxă
import java.time.ZoneId;

static ZoneId of(String id)
static ZoneId systemDefault()
static Set<String> getAvailableZoneIds()

Ce face ZoneId

ZoneId reprezintă un fus orar cu toate regulile lui: diferența față de UTC și datele de trecere la ora de vară, inclusiv cele istorice. Se folosește cu ZonedDateTime, Instant.atZone și LocalDate.now(zona).

ZoneId.of("Europe/Bucharest") alege un fus după numele lui din baza de date IANA (format „Continent/Oraș”). Se acceptă și "UTC" sau diferențe fixe ca "+02:00", dar acestea nu au oră de vară. Un nume necunoscut aruncă ZoneRulesException.

ZoneId.systemDefault() returnează fusul orar setat pe calculatorul sau serverul pe care rulează programul. Rezultatul diferă de la o mașină la alta.

Parametri

Parametru Descriere
id Numele fusului orar, de exemplu "Europe/Bucharest", "Europe/Chisinau", "UTC".

Ce returnează

Un ZoneId.

Exemple

Exemplul 1: Fusul orar al sistemului

Depinde de setările calculatorului.

import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        ZoneId zona = ZoneId.systemDefault();
        System.out.println("Fusul orar al sistemului: " + zona);
    }
}

Rezultat posibil (diferă la fiecare rulare)

Fusul orar al sistemului: Europe/Bucharest

Exemplul 2: Fusuri alese după nume

import java.time.Instant;
import java.time.ZoneId;
import java.time.zone.ZoneRulesException;

public class Main {
    public static void main(String[] args) {
        Instant moment = Instant.parse("2026-10-19T12:00:00Z");
        for (String id : new String[] {"Europe/Bucharest", "Europe/Chisinau", "UTC", "+05:30"}) {
            ZoneId z = ZoneId.of(id);
            System.out.println(id + " -> " + moment.atZone(z).toLocalTime() + " (" + z.getRules().getOffset(moment) + ")");
        }
        try {
            ZoneId.of("Europe/Iasi");
        } catch (ZoneRulesException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

Europe/Bucharest -> 15:00 (+03:00)
Europe/Chisinau -> 15:00 (+03:00)
UTC -> 12:00 (Z)
+05:30 -> 17:30 (+05:30)
Eroare: Unknown time-zone ID: Europe/Iasi

Exemplul 3: Fusuri disponibile pentru Europa

import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        ZoneId.getAvailableZoneIds().stream()
                .filter(z -> z.startsWith("Europe/B"))
                .sorted()
                .forEach(System.out::println);
    }
}

Rezultat

Europe/Belfast
Europe/Belgrade
Europe/Berlin
Europe/Bratislava
Europe/Brussels
Europe/Bucharest
Europe/Budapest
Europe/Busingen

Greșeli frecvente

  • Te bazezi pe systemDefault() într-o aplicație pe server. Serverele sunt des setate pe UTC; dă fusul explicit.
  • Folosești ZoneId.of("+02:00") pentru România. Diferența fixă nu trece la ora de vară.

Comenzi înrudite

  • ZonedDateTime: Data și ora împreună cu fusul orar (Europe/Bucharest); indică un moment exact și știe de ora de vară.
  • 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).
  • Instant: Un moment exact pe axa timpului, în UTC, măsurat în secunde și nanosecunde de la 1 ianuarie 1970.
  • LocalDate.now: Returnează data de azi, după ceasul sistemului și fusul orar implicit (sau unul dat ca parametru).