Как я могу увеличить java.sql.Timestamp на 14 дней? - PullRequest
24 голосов
/ 17 сентября 2011

У меня есть приложение, которое принимает отметку времени в качестве границы для даты начала и окончания выбора 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?

Ответы [ 4 ]

47 голосов
/ 17 сентября 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 использовать другой часовой пояс.

7 голосов
/ 17 сентября 2011

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

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

3 голосов
/ 29 мая 2017

Ява 8

Timestamp old;
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC"));
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant());
2 голосов
/ 21 октября 2015
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);
}
...