Учитывая целый час дня, как найти следующий целый час?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Учитывая целый час дня, как найти следующий целый час?

Сообщение Anonymous »

Мне нужно перебрать все часы интервала определенного дня. Итак, учитывая время в один целый час в рассматриваемый день, скажем, 01:00, как мне найти следующий целый час? Следующий целый час обычно будет 02:00, но из-за летнего времени (DST) и других аномалий это может быть снова 01:00 или 03:00 или, возможно, даже другие часы.
Если сейчас снова 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]
На острове Лорд-Хау летнее время смещено на 30 минут. Когда летнее время заканчивается и время приближается к 02:00, оно корректируется на 01:30. Усечение возвращает нас к 01:00, с которого мы начали. Я могу повторить операцию, но всегда вернусь к тому, с чего начал. Вместо этого желаемый результат — это первый целый час после перехода, то есть 02:00 по стандартному времени, то есть 2026-04-05T02:00+10:30[Australia/Lord_Howe].
Для точности: мне нужен следующий момент времени (следующий момент), когда часы в рассматриваемом часовом поясе показывают целый час (минуты, секунды и доли секунды). равно 0).

Подробнее здесь: https://stackoverflow.com/questions/797 ... whole-hour
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»