ZonedDateTime.withZoneSameInstant în Java

Convertește momentul în alt fus orar: același moment, altă oră pe ceas (14:00 la București = 12:00 la Londra).

Sintaxă
ZonedDateTime withZoneSameInstant(ZoneId zona)
ZonedDateTime withZoneSameLocal(ZoneId zona)

Ce face ZonedDateTime.withZoneSameInstant

withZoneSameInstant răspunde la întrebarea „cât este ceasul în alt oraș în acest moment?”. Momentul rămâne același; se schimbă ora afișată și fusul orar. 14:00 la București vara este 07:00 la New York.

Metoda înrudită withZoneSameLocal face opusul: păstrează ora de pe ceas și schimbă momentul. 14:00 la București devine 14:00 la New York, adică alt moment. Pentru conversii între orașe ai aproape mereu nevoie de withZoneSameInstant.

Parametri

Parametru Descriere
zona Fusul orar țintă, de exemplu ZoneId.of("America/New_York").

Ce returnează

Un ZonedDateTime nou, în fusul orar cerut.

Exemple

Exemplul 1: Ora unei ședințe online în alte orașe

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime sedinta = ZonedDateTime.of(2026, 10, 20, 16, 0, 0, 0, ZoneId.of("Europe/Bucharest"));
        DateTimeFormatter f = DateTimeFormatter.ofPattern("dd.MM HH:mm");
        for (String oras : new String[] {"Europe/Bucharest", "Europe/London", "America/New_York", "Asia/Tokyo"}) {
            ZonedDateTime local = sedinta.withZoneSameInstant(ZoneId.of(oras));
            System.out.println(oras + ": " + local.format(f));
        }
    }
}

Rezultat

Europe/Bucharest: 20.10 16:00
Europe/London: 20.10 14:00
America/New_York: 20.10 09:00
Asia/Tokyo: 20.10 22:00

Exemplul 2: SameInstant față de SameLocal

import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime t = ZonedDateTime.of(2026, 10, 19, 14, 0, 0, 0, ZoneId.of("Europe/Bucharest"));
        ZoneId ny = ZoneId.of("America/New_York");
        ZonedDateTime acelasiMoment = t.withZoneSameInstant(ny);
        ZonedDateTime aceeasiOra = t.withZoneSameLocal(ny);
        System.out.println("Original:     " + t);
        System.out.println("SameInstant:  " + acelasiMoment + "  același moment? " + acelasiMoment.isEqual(t));
        System.out.println("SameLocal:    " + aceeasiOra + "  același moment? " + aceeasiOra.isEqual(t));
    }
}

Rezultat

Original:     2026-10-19T14:00+03:00[Europe/Bucharest]
SameInstant:  2026-10-19T07:00-04:00[America/New_York]  același moment? true
SameLocal:    2026-10-19T14:00-04:00[America/New_York]  același moment? false

Greșeli frecvente

  • Folosești withZoneSameLocal pentru conversie între orașe. Ora rămâne aceeași, dar momentul se schimbă: ședința ar fi programată greșit.
  • Compari momente din fusuri diferite cu equals. equals compară și fusul orar; pentru „același moment” folosește isEqual.

Comenzi înrudite

  • ZonedDateTime: Data și ora împreună cu fusul orar (Europe/Bucharest); indică un moment exact și știe de ora de vară.
  • ZoneId: Identifică un fus orar (Europe/Bucharest) cu regulile lui de oră de vară; of îl alege, systemDefault dă fusul sistemului.
  • Instant: Un moment exact pe axa timpului, în UTC, măsurat în secunde și nanosecunde de la 1 ianuarie 1970.
  • DateTimeFormatter: Descrie cum se scrie sau se citește o dată ca text; ofPattern(„dd.MM.yyyy”) creează un format din litere.