Если сейчас снова 01:00, это именно тот результат, который мне нужен, если я могу отличить первые 01:00 — поэтому мне понадобится, например, ZonedDateTime или Мгновенно.
Следующий целый час может быть «полночью», началом следующего дня, но мне нет необходимости идти дальше в следующий день.
Легко, скажете вы, прибавьте один час. Но не везде летнее время означает перевод часов ровно на один час, так что я могу снова не пробить целый час. И, по крайней мере, в прошлом происходили изменения часовых поясов, которые переводили часы вперед или назад на забавные величины, например +0:09:40 (датское время 1894 года).
Следующая идея: добавить час и усечь его до целых часов. Следующий пример показывает, что это также не всегда дает правильное время. В примере используется часовой пояс Australia/Lord_Howe просто для примера.
Код: Выделить всё
ZoneId zoneId = ZoneId.of("Australia/Lord_Howe");
ZonedDateTime zdt = ZonedDateTime.of(2026, 4, 5,
1, 0, 0, 0, zoneId);
System.out.println(zdt);
System.out.println(zdt.plusHours(1));
System.out.println(zdt.plusHours(1).truncatedTo(ChronoUnit.HOURS));
Код: Выделить всё
2026-04-05T01:00+11:00[Australia/Lord_Howe]
2026-04-05T01:30+10:30[Australia/Lord_Howe]
2026-04-05T01:00+11:00[Australia/Lord_Howe]
Для точности: мне нужен следующий момент времени (следующий момент), когда часы в рассматриваемом часовом поясе показывают целый час (все минуты, секунды и доли секунды равны 0).
Подробнее здесь: https://stackoverflow.com/questions/797 ... whole-hour
Мобильная версия