Menu
Coddy logo textTech

Manejo de zonas horarias

Parte de la sección Lógica y Flujo del Journey de Java de Coddy — lección 59 de 59.

ZonedDateTime en Java representa una fecha y hora con una zona horaria. Es útil cuando se trabaja con diferentes zonas horarias o se convierte entre ellas.

Crea una hora en una zona específica:

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

También puedes crear un ZonedDateTime a partir de un LocalDateTime usando .atZone():

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

Convertir la hora entre zonas:

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

Después de ejecutar el código anterior, newYork contiene el mismo instante que tokyo pero en la zona horaria de Nueva York:

2024-03-15T10:30-04:00[America/New_York]
// Ejemplo de salida

Para formatear un ZonedDateTime, utiliza DateTimeFormatter. Puedes incluir el desplazamiento de la zona horaria en la salida utilizando la letra de patrón Z o XXX:

// Sin desplazamiento
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

// Con desplazamiento (p. ej. +09:00 o -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm XXX");

String result = newYork.format(fmtWithOffset);
// Ejemplo: 2024-03-15 10:30 -04:00
challenge icon

Desafío

Fácil

Crea un método llamado convertTime que reciba cuatro argumentos:

  1. Un String (dateTimeStr) en formato "yyyy-MM-dd HH:mm"
  2. Un String (sourceZone) con el ID de la zona horaria de origen
  3. Un String (targetZone) con el ID de la zona horaria de destino
  4. Un booleano (showOffset) que indica si se debe incluir el desplazamiento de la zona horaria en la salida

El método debe:

  1. Analizar la fecha y hora de entrada en la zona horaria de origen
  2. Convertirla a la zona horaria de destino
  3. Devolver información formateada sobre ambas horas

Los mensajes de retorno deben ser:

  • Si la fecha y hora no son válidas: devolver "Invalid datetime format"
  • Si la zona no es válida: devolver "Invalid time zone"
  • Si showOffset es true: incluir el desplazamiento en la salida
  • Formato: "Source: [time1], Target: [time2]"

Pruébalo tú mismo

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) {
        // Escribe tu código aquí
    }
    
    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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo