1
resposta

Exercício 09

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

public class Exercicios {
    public static void main(String[] args) {
        ZonedDateTime horaAtual = ZonedDateTime.now();
        DateTimeFormatter formato = DateTimeFormatter.ofPattern("hh:mm");

        ZonedDateTime horaSydney = horaAtual.withZoneSameInstant(
                ZoneId.of("Australia/Sydney"));
        System.out.println("Horário atual no sistema: " + horaAtual.format(formato));
        System.out.println("Horário atual em Sydney: " + horaSydney.format(formato));

    }
}
1 resposta

Olá, Bernardo. Como vai?

Parabéns pela resolução do exercício! O seu código está muito bem estruturado e demonstra que você compreendeu perfeitamente como trabalhar com fusos horários na API java.time do Java.

A escolha do método withZoneSameInstant foi cirúrgica e está totalmente correta. Esse método é a forma ideal de realizar conversões de fuso horário em sistemas globais, pois ele altera a região (o ZoneId) mas mantém o exato mesmo instante no tempo (o mesmo milissegundo no planeta), recalculando apenas as horas e minutos locais.

Para agregar ainda mais valor ao seu aprendizado, identifiquei duas oportunidades de melhoria muito importantes baseadas em boas práticas de formatação e tratamento de dados no Java:

1. Ajuste no Padrão de Formatação (Horas de 12h vs 24h)

No seu objeto DateTimeFormatter, você utilizou o padrão de formatação "hh:mm" com as letras h minúsculas:

DateTimeFormatter formato = DateTimeFormatter.ofPattern("hh:mm");

Na especificação do Java, as letras hh minúsculas representam o formato de 12 horas (de 01 a 12), feito para ser usado junto com o indicador AM/PM. Se você rodar o seu programa às 20:00 da noite, o padrão hh:mm vai exibir na tela 08:00. Como não há a indicação se é manhã ou noite, isso pode gerar confusões em relatórios ou sistemas financeiros.

Como boa prática para sistemas que precisam de precisão, o recomendado é utilizar as letras H maiúsculas ("HH:mm"), que representam o formato de 24 horas (de 00 a 23). Veja a diferença:

// Formato padrão de 24 horas para evitar ambiguidades
DateTimeFormatter formato = DateTimeFormatter.ofPattern("HH:mm");

2. Especificação do Fuso Horário de Origem

Na primeira linha do seu método main, você utilizou:

ZonedDateTime horaAtual = ZonedDateTime.now();

O método ZonedDateTime.now() sem nenhum parâmetro captura o fuso horário da máquina local onde o código está rodando. Em ambiente de desenvolvimento (na sua máquina) isso funciona perfeitamente. No entanto, se o seu sistema for publicado em um servidor de nuvem (como AWS ou Azure) localizado em outro país, o servidor capturará o fuso dele (que costuma ser o padrão UTC/GMT), alterando o resultado final do seu cálculo.

Uma excelente prática de mercado ao trabalhar com datas e horas é sempre explicitar qual fuso você deseja capturar na largada. Se o objetivo é pegar a hora atual baseada no fuso de Brasília, passamos o ZoneId logo na criação:

ZonedDateTime horaAtual = ZonedDateTime.now(ZoneId.of("America/Sao_Paulo"));

Aplicando essas duas pequenas alterações, o esqueleto principal do seu código ganha muito mais robustez profissional:

ZonedDateTime horaAtual = ZonedDateTime.now(ZoneId.of("America/Sao_Paulo"));
DateTimeFormatter formato = DateTimeFormatter.ofPattern("HH:mm");

ZonedDateTime horaSydney = horaAtual.withZoneSameInstant(ZoneId.of("Australia/Sydney"));

System.out.println("Horário atual (Brasília): " + horaAtual.format(formato));
System.out.println("Horário atual em Sydney: " + horaSydney.format(formato));

Trabalhar com fuso horário é um desafio recorrente na carreira de desenvolvimento, e você já dominou a parte mais complexa da lógica! Continue praticando e avançando nos recursos da linguagem.

Espero que possa ter lhe ajudado!