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 al trabajar con diferentes zonas horarias o al convertir entre ellas.

Crear una fecha y hora en una zona horaria específica:

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

También puedes convertir un LocalDateTime a un ZonedDateTime usando .atZone():

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

.atZone() adjunta una zona horaria a una fecha-hora local existente, produciendo un ZonedDateTime.

Convertir tiempo 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]
// Example output

Para formatear un ZonedDateTime, use DateTimeFormatter. La letra de patrón Z o xxx formatea el desplazamiento UTC (p. ej. +09:00), y VV formatea el ID de zona (p. ej. Asia/Tokyo):

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String formatted = tokyo.format(formatter);
// Example: 2024-03-15 10:30 +09:00
challenge icon

Desafío

Fácil

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

  1. Una String (dateTimeStr) en formato "yyyy-MM-dd HH:mm"
  2. Una String (sourceZone) ID de zona horaria de origen
  3. Una String (targetZone) ID de zona horaria de destino
  4. Un boolean (showOffset) si incluir el desplazamiento de 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 es inválida: devolver "Invalid datetime format"
  • Si la zona es inválida: devolver "Invalid time zone"
  • Si showOffset es true: incluir el desplazamiento en la salida
  • Formato: "Source: [time1], Target: [time2]"

Hoja de referencia

ZonedDateTime representa una fecha y hora con una zona horaria, útil para trabajar con diferentes zonas horarias.

Crear una hora en una zona específica:

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

Convertir un LocalDateTime a un ZonedDateTime usando .atZone():

LocalDateTime local = LocalDateTime.now();
ZonedDateTime zoned = local.atZone(ZoneId.of("Asia/Tokyo"));

Convertir la hora entre zonas:

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

Formatear un ZonedDateTime incluyendo el desplazamiento UTC usando patrones Z o xxx:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String formatted = zoned.format(formatter);
// Example: 2024-03-15 10:30 +09:00

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