Как увеличить 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());