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!