Как увеличить 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?
Ответы
Ответ 1
Стоит отметить, что 14 дней не всегда 14 * 24 * 3600 секунд. Когда у вас есть летнее время, это может быть на час короче или дольше. Исторически это может быть намного сложнее, чем это.
Вместо этого я бы предложил использовать JodaTime или Calendar для выполнения зависимого от часового пояса расчета.
Ответ 2
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 использовать, если это необходимо, другой часовой пояс.
Ответ 3
private Long dayToMiliseconds(int days){
Long result = Long.valueOf(days * 24 * 60 * 60 * 1000);
return result;
}
public Timestamp addDays(int days, Timestamp t1) throws Exception{
if(days < 0){
throw new Exception("Day in wrong format.");
}
Long miliseconds = dayToMiliseconds(days);
return new Timestamp(t1.getTime() + miliseconds);
}
Ответ 4
Java 8
Timestamp old;
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC"));
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant());