1
resposta

Exercício 08

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:ss");

        ZonedDateTime horaToquio = horaAtual.withZoneSameInstant(
                ZoneId.of("Asia/Tokyo"));
        System.out.println("Horário atual em Tóquio: " + horaToquio.format(formato));

    }
}
1 resposta

Olá, Bernardo. Como vai?

Parabéns por resolver mais um exercício! O seu código está ótimo e mostra que você pegou muito bem o jeito de realizar conversões de fusos horários utilizando a classe ZonedDateTime e o método withZoneSameInstant().

Como você está estudando o capítulo de Fuso horário, vale muito a pena entender o que o Java faz nos bastidores para que essa conversão aconteça sem erros. A classe ZonedDateTime pode ser visualizada como uma estrutura que junta três informações essenciais: a data e hora local (LocalDateTime), o fuso horário da região (ZoneId) e o deslocamento exato em relação ao fuso de referência de Greenwich (ZoneOffset).

Quando você utiliza o método withZoneSameInstant(), o Java preserva o instante universal (o momento exato no tempo no planeta Terra) e altera apenas a regra do fuso horário e do deslocamento local, recalculando o relógio de forma perfeita.

Para agregar ainda mais valor ao seu código e dar continuidade às boas práticas que vimos no exercício anterior, separei duas sugestões de refinamento para este script:

1. Cuidado com o formato de 12h vs 24h na exibição dos segundos

No seu DateTimeFormatter, você definiu o padrão como "hh:mm:ss":

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

Assim como acontece com as horas e minutos, o uso das letras hh minúsculas vai limitar a exibição ao formato de 12 horas. Se em Tóquio for 21:30:15 da noite, o seu sistema imprimirá na tela 09:30:15.

Para evitar qualquer ambiguidade na leitura dos segundos e das horas (especialmente em relatórios de auditoria ou fechamentos financeiros, que exigem precisão do horário), lembre-se de adotar as letras H maiúsculas para o formato de 24 horas:

DateTimeFormatter formato = DateTimeFormatter.ofPattern("HH:mm:ss");

2. Fixando o fuso de partida para garantir a consistência

Se você executar o comando ZonedDateTime.now() sem especificar o fuso de origem, o Java assumirá o fuso da máquina onde o programa está rodando.

Se o objetivo do exercício é converter o horário oficial de Brasília para o horário de Tóquio, o ideal é blindar o seu código definindo a origem explicitamente. Caso contrário, se esse código for executado em um servidor de nuvem internacional, o horário de partida será alterado e o cálculo para Tóquio trará um resultado inesperado.

Veja como o seu código fica aplicando essas correções de consistência:

// Definindo explicitamente o fuso de origem (Brasília)
ZonedDateTime horaAtual = ZonedDateTime.now(ZoneId.of("America/Sao_Paulo"));

// Alterando para o padrão de 24 horas com segundos
DateTimeFormatter formato = DateTimeFormatter.ofPattern("HH:mm:ss");

// Convertendo para o fuso de Tóquio mantendo o mesmo instante
ZonedDateTime horaToquio = horaAtual.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));

System.out.println("Horário atual em Brasília: " + horaAtual.format(formato));
System.out.println("Horário atual em Tóquio: " + horaToquio.format(formato));

Trabalhar com a API de tempo do Java (java.time) de forma explícita e padronizada evita muitas dores de cabeça em ambientes de produção. Excelente trabalho e continue praticando!

Espero que possa ter lhe ajudado!