Menu
Coddy logo textTech

Tratamento de Fuso Horário

Parte da seção Lógica e Fluxo do Journey de Java da Coddy — lição 59 de 59.

ZonedDateTime no Java representa uma data e hora com um fuso horário. É útil ao trabalhar com diferentes fusos horários ou converter entre eles.

Crie uma data e hora em um fuso horário específico:

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

Você também pode converter um LocalDateTime para um ZonedDateTime usando .atZone():

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

.atZone() anexa um fuso horário a uma data-hora local existente, produzindo um ZonedDateTime.

Converter horário entre fusos horários:

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

Após executar o código acima, newYork contém o mesmo instante que tokyo, mas no fuso horário de Nova York:

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

Para formatar um ZonedDateTime, use DateTimeFormatter. A letra do padrão Z ou xxx formata o deslocamento UTC (ex.: +09:00), e VV formata o ID da zona (ex.: 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

Desafio

Fácil

Crie um método chamado convertTime que recebe quatro argumentos:

  1. Uma String (dateTimeStr) no formato "yyyy-MM-dd HH:mm"
  2. Uma String (sourceZone) ID da zona horária de origem
  3. Uma String (targetZone) ID da zona horária de destino
  4. Um boolean (showOffset) se deve incluir o offset da zona horária na saída

O método deve:

  1. Analisar a data e hora de entrada na zona horária de origem
  2. Converter para a zona horária de destino
  3. Retornar informações formatadas sobre ambos os horários

As mensagens de retorno devem ser:

  • Se data/hora inválida: retornar "Invalid datetime format"
  • Se zona inválida: retornar "Invalid time zone"
  • Se showOffset for true: incluir offset na saída
  • Formato: "Source: [time1], Target: [time2]"

Folha de consulta

ZonedDateTime representa uma data e hora com um fuso horário, útil para trabalhar com diferentes fusos horários.

Crie um horário em um fuso horário específico:

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

Converta um LocalDateTime para um ZonedDateTime usando .atZone():

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

Converta o horário entre fusos horários:

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

Formate um ZonedDateTime incluindo o offset UTC usando padrões Z ou xxx:

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

Experimente você mesmo

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) {
        // Escreva seu código aqui
    }
    
    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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo