Menu
Coddy logo textTech

Gestione dei fusi orari

Fa parte della sezione Logica e flusso del percorso Java di Coddy. Lezione 59 di 59.

ZonedDateTime in Java rappresenta una data e un'ora con un fuso orario. È utile quando si lavora con fusi orari diversi o si eseguono conversioni tra di essi.

Crea un orario in una zona specifica:

ZonedDateTime tokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

Puoi anche creare un ZonedDateTime da un LocalDateTime usando .atZone():

LocalDateTime localDT = LocalDateTime.of(2024, 3, 15, 10, 30);
ZonedDateTime tokyo = localDT.atZone(ZoneId.of("Asia/Tokyo"));

Converti l'ora tra i fusi orari:

ZonedDateTime newYork = tokyo.withZoneSameInstant(ZoneId.of("America/New_York"));

Dopo aver eseguito il codice precedente, newYork contiene lo stesso istante di tokyo, ma nel fuso orario di New York:

2024-03-15T10:30-04:00[America/New_York]
// Esempio di output

Per formattare un ZonedDateTime, usa DateTimeFormatter. Aggiungi l’offset con il pattern xxx: stampa +09:00 o -04:00 e un offset zero come +00:00 (il pattern maiuscolo XXX stampa invece Z per un offset zero):

// Senza offset
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// Con offset (ad es. +09:00 o -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String result = newYork.format(fmtWithOffset);
// Esempio: 2024-03-15 10:30 -04:00
challenge icon

Sfida

Facile

Crea un metodo chiamato convertTime che accetti quattro argomenti:

  1. Una String (dateTimeStr) nel formato "yyyy-MM-dd HH:mm"
  2. Una String (sourceZone) ID del fuso orario di origine
  3. Una String (targetZone) ID del fuso orario di destinazione
  4. Un boolean (showOffset) che indica se includere l’offset del fuso orario nell’output

Il metodo dovrebbe:

  1. Analizzare la data e l’ora di input nel fuso orario di origine
  2. Convertirla nel fuso orario di destinazione
  3. Restituire informazioni formattate su entrambi gli orari

I messaggi restituiti dovrebbero essere:

  • Se la data e l’ora non sono valide: restituisci "Invalid datetime format"
  • Se il fuso non è valido: restituisci "Invalid time zone"
  • Se showOffset è true: includi l’offset nell’output, formattato con il pattern xxx, così un offset pari a zero viene visualizzato come +00:00
  • Formato: "Source: [time1], Target: [time2]"

Provalo tu

import java.util.Scanner;
import java.time.*;
import java.time.format.*;

public class Main {
    public static String convertTime(String dateTimeStr, String sourceZone, 
                                   String targetZone, boolean showOffset) {
        // Scrivi il tuo codice qui
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String dateTimeStr = scanner.nextLine();
        String sourceZone = scanner.nextLine();
        String targetZone = scanner.nextLine();
        boolean showOffset = Boolean.parseBoolean(scanner.nextLine());
        
        System.out.println(convertTime(dateTimeStr, sourceZone, targetZone, showOffset));
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Java online