Как увеличить java.sql.Timestamp на 14 дней?

У меня есть приложение, которое использует метку времени в качестве границы для даты начала и даты окончания выбора sql, я хочу заполнить хэш-карту неделями в этом году с первого понедельника года в качестве значений и номер недели в качестве ключей . Мне очень сложно работать с отметками времени, и мне не очень нравится добавлять к ним 86 400 000 секунд, чтобы увеличить день, так как это не учитывает високосные дни, часы, секунды.

Я планирую добавить к нему 13 дней 23 часа, 59 минут и 59 секунд, чтобы я мог искать дату начала на карте по неделям в качестве ключа, а затем использовать дату начала, чтобы получить дату окончания.

Итак, я пытаюсь получить что-то вроде этого:

Week  startDate              endDate
1     2011-01-03 00:00:00    2011-01-16 23:59:59
2     2011-01-17 00:00:00    2011-01-30 23:59:59

С первыми двумя столбцами на карте и последним, вычисляемым после поиска. Как безопасно увеличить java.sql.Timestamp?


person davidahines    schedule 16.09.2011    source источник
comment
Единственная проблема, о которой вам придется беспокоиться, это високосные секунды, а такие случаются раз в несколько лет. Если бы ваша программа работала с 1970 года, она отставала бы всего на 24 секунды. Ваш план добавить 86,4 млн секунд вполне осуществим.   -  person corsiKa    schedule 17.09.2011
comment
Как насчет работы с Календарем или Джодой? joda-time.sourceforge.net   -  person    schedule 17.09.2011
comment
Я предполагаю, что реальный вопрос в том, что вы идентифицировали это как блокировщик для своего приложения? Если у вас нет, просто пойти с ним. Если это проблема, она представится сама собой, и тогда вы сможете ее решить.   -  person corsiKa    schedule 17.09.2011
comment
не ответ на ваш вопрос, а предложение попробовать что-нибудь: вы упомянули, что метка времени используется в качестве границы для даты начала и даты окончания. вместо того, чтобы вычислять временную метку даты окончания в java, а затем передавать ее в своем запросе, почему бы не передать имеющуюся у вас временную метку даты начала, а затем рассчитать временную метку конечной даты с помощью функций даты/времени базы данных на ее основе?   -  person    schedule 17.09.2011
comment
Есть ли какая-то причина, по которой вам нужно точное, включающее timestamp? Почему бы вместо этого не использовать инклюзивно-›исключительный диапазон (date или timestamp)? Итак, >= startDate AND < endDate - тогда просто прибавьте 14 дней, и вам вообще не придется беспокоиться о секундах...   -  person Clockwork-Muse    schedule 17.09.2011


Ответы (3)


Стоит отметить, что 14 дней — это не всегда 14*24*3600 секунд. При переходе на летнее время это может быть на час меньше или больше. Исторически это может быть намного сложнее.

Вместо этого я бы предложил использовать JodaTime или Calendar для выполнения расчета в зависимости от часового пояса.

person Peter Lawrey    schedule 16.09.2011
comment
Хотя это действительно имеет значение? Пока вы используете UTC, вы не столкнетесь с этой проблемой. - person corsiKa; 17.09.2011
comment
SQL в основном не использует UTC. Особенно, если вы явно не заметили этого. - person Adrian Pronk; 17.09.2011
comment
Если вы используете GMT ​​или любой часовой пояс без перехода на летнее время, это не проблема. Я хотел отметить, что 14 дней могут содержать день, в котором нет 24 часов. Java не поддерживает високосные секунды, как GMT, но поддерживает UTC. ;) - person Peter Lawrey; 17.09.2011

java.sql.Timestamp ts = ...
Calendar cal = Calendar.getInstance();
cal.setTime(ts);
cal.add(Calendar.DAY_OF_WEEK, 14);
ts.setTime(cal.getTime().getTime()); // or
ts = new Timestamp(cal.getTime().getTime());

Это будет правильно учитывать переходы на летнее время в вашем часовом поясе по умолчанию. Вы можете указать классу Calendar использовать другой часовой пояс, если это необходимо.

person Adrian Pronk    schedule 16.09.2011
comment
Это будет правильно учитывать летнее время только в том случае, если ваша виртуальная машина имеет обновленный список. JodaTime позволяет использовать для этого стандартный источник — предположительно, обновления ВМ для этого исторически были медленными. - person Clockwork-Muse; 17.09.2011
comment
Я подозреваю, что одной из причин медленных обновлений является то, что корпоративные пользователи остаются на jvms, которым не менее 10 лет... С другой стороны, большинству ОС удается вести список информации о часовых поясах, в котором есть вся необходимая информация. jre действительно должен использовать это. На моем ноутбуке с Linux он, кажется, установлен до 2499... - person KarlP; 17.09.2011

Ява 8

Timestamp old;
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC"));
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant());
person Anders B    schedule 29.05.2017
comment
@EugeneA Это java.sql.Timestamp. - person Boss Man; 17.05.2019
comment
Зачем вам нужен ZonedDateTime? Timestamp new = Timestamp.from(old.toInstant().plus(14, ChronoUnit.DAYS)); - person Maxime Chéramy; 20.08.2019