Я не могу быть уверен в информации, которую вы предоставили, но вероятная причина в том, что настройка часового пояса вашей JVM - UTC. Если вы запустили свою программу, скажем, в 15:09:55 по сингапурскому времени, это вывело бы как 7 и 9 в UTC. Если вы затем прочитаете свои часы по сингапурскому времени чуть более минуты спустя или прочитаете их с часов, которые не были идеально синхронизированы с вашим устройством (или имитатором), они показывали бы 15:11.
JVM обычно получает настройку часового пояса с устройства, но могут быть разные причины, по которым он получает его откуда-то еще.
Как сказал Антон А. в комментарии, вам нужно HOUR_OF_DAY
вместо HOUR
для 24-часового формата (хотя время было 7:09 утра в UTC, поэтому эта ошибка не была причиной неожиданного часа в вашем случае).
java.time
Современный способ печати текущего времени:
System.out.println(LocalTime.now(ZoneId.of("Asia/Singapore")));
Класс Calendar
, который вы использовали, давно устарел и плохо спроектирован. LocalTime
- это класс из java.time, современного Java-API даты и времени, который представляет время дня (без часового пояса, но метод now
принимает часовой пояс для инициализации текущего времени в этом поясе). , Если ваше Android-устройство меньше нового (на уровне API 26), вам потребуется библиотека ThreeTenABP , чтобы использовать ее. См. Как использовать ThreeTenABP в Android Project .
Еще одна ссылка: Обучающая программа Oracle: Дата и время , объясняющая, как использовать java.time
.