Как вы храните диапазоны дат, которые на самом деле являются временными метками - PullRequest
7 голосов
/ 01 октября 2008

Java и Oracle имеют тип timestamp с именем Date. Разработчики склонны манипулировать ими, как если бы это были календарь даты, которые, как я видел, вызывают неприятные одноразовые ошибки.

  1. Для базовой величины даты вы можете просто отрубить часть времени при вводе, то есть уменьшить точность. Но если вы делаете это с диапазоном дат (например: 9 / 29-9 / 30 ), разница между этими двумя значениями составляет 1 день, а не 2. Кроме того, для сравнения диапазонов требуется либо 1) операция усечения: start < trunc(now) <= end или 2) арифметика: start < now < (end + 24hrs). Не ужасно, но не DRY .

  2. Альтернативой является использование истинных временных отметок: 9/29 00:00:00 - 10/1 00:00:00. (с полуночи до полуночи, поэтому не включает какую-либо часть октября). Теперь длительности по сути правильны, а сравнения диапазонов проще: start <= now < end. Конечно, более чистая для внутренней обработки, однако даты окончания необходимо преобразовывать при первоначальном вводе (+1) и при выводе (-1), предполагая метафору календарной даты на уровне пользователя.

Как вы справляетесь с диапазонами дат в вашем проекте? Есть ли другие альтернативы? Меня особенно интересует, как вы справляетесь с этим как на стороне Java, так и на стороне уравнения.

Ответы [ 11 ]

0 голосов
/ 01 октября 2008

Исходя из вашего первого предложения, вы наткнулись на одну из скрытых «особенностей» (то есть ошибок) Java: java.util.Date должен был быть неизменным, но это не так. (Java 7 обещает исправить это с помощью нового API даты / времени.) Почти каждое корпоративное приложение рассчитывает на различные временные шаблоны , и в какой-то момент вам придется выполнять арифметику по дате и времени.

В идеале вы можете использовать Время Joda , которое используется Календарем Google. Если вы не можете сделать это, я думаю, API, который состоит из оболочки около java.util.Date с вычислительными методами, похожими на Grails / Rails, и диапазона вашей оболочки (то есть упорядоченной пары, указывающей начало и конец времени период) будет достаточно.

В моем текущем проекте (приложение для учета рабочего времени) мы пытаемся нормализовать все наши даты в одном часовом поясе для Oracle и Java. К счастью, наши требования к локализации невелики (достаточно = 1 часовой пояс). Когда постоянный объект не нуждается в большей точности, чем день, мы используем метку времени от полуночи. Я бы пошел дальше и настаивал на том, чтобы отбросить лишние миллисекунды в самую грубую гранулярность, которую может выдержать постоянный объект (это сделает вашу обработку проще).

...