Преобразование порядкового номера часа дня в значение даты и времени

Некоторые предприятия отслеживают события во времени по «окончанию часа». Каждый час дня представлен порядковым номером:

  • 1…24 для UTC
  • 1…23, 1…24 и 1…25 для часовых поясов с одночасовой регулировкой летнего времени (DST).

Таким образом, первый час дня с полуночи до 01:00 — Hour Ending 01.

Мне кажется, что это глупый способ отслеживать время. Более разумным было бы использование времени дня в полуоткрытом подходе, [), где начало включает в себя, а конец исключает. Так:

  • 2014-12-05T01:00:00.000 отметит Hour Ending 01
  • 2014-12-06T00:00:00.000 (полночь) означает Hour Ending 24.

Действительно, это то, что я хочу хранить в своей базе данных (Postgres), в TIMESTAMP WITH TIME ZONE преобразовано из даты и порядкового номера часа. Итак, мой вопрос:

Учитывая дату и порядковый номер «Окончание часа» (1…23/24/25 для местности с 1-часовым переходом на летнее время), как преобразовать в значение даты и времени?

Я знаком с Joda-Time и java.time. Предлагает ли какой-либо из них способ конвертации? Если нет, то какой алгоритм обрабатывает как преобразование порядкового номера, так и переход на летнее время?

Или мне не бороться с этим, а просто хранить локальную дату в виде строки с суффиксом порядкового номера часа?


person Basil Bourque    schedule 05.12.2014    source источник
comment
На самом деле вам не нужны java.time или Joda для этого. Разве вы не можете просто использовать обычный объект Calendar, установить день, месяц и год, установить его на полночь, а затем добавить нужное количество часов? Это будет работать в начале и в конце летнего времени.   -  person Dawood ibn Kareem    schedule 06.12.2014
comment
@DavidWallace В качестве политики я избегаю беспорядка, связанного с java.util.Date/.Calendar. Но ваша идея кажется здравой и поразительно простой. Joda-Time имеет метод withTimeAtStartOfDay для получения первого момента дня. Метод plusHours может использовать число окончания часа для получения значения даты и времени. Для преобразования из date+hourEnding в дату-время это должно работать. Пойду другим путем, я не уверен.   -  person Basil Bourque    schedule 06.12.2014
comment
Идя наоборот, вам просто нужно взять разницу в часах между заданным временем и полуночью того же дня.   -  person Dawood ibn Kareem    schedule 06.12.2014


Ответы (1)


Возможно, вам нужен java.time метод truncatedTo, который можно использовать для получения любого ZonedDateTime и сокращения минут и секунд.

ZonedDateTime zdt = ZonedDateTime.now();
ZonedDateTime rounded = zdt.truncatedTo(ChronoUnit.HOURS);
ZonedDateTime hourEnd = rounded.plusHours(1);
person JodaStephen    schedule 09.12.2014