如何将java.sql.Timestamp增加14天?

dav*_*nes 25 java sql timestamp increment

我有一个应用程序,它将一个时间戳作为sql选择的开始日期和结束日期的边界,我希望从今年的第一个星期一开始填充一个星期几周的hashmap作为值和周数作为键.我发现很难使用时间戳,我觉得增加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
Run Code Online (Sandbox Code Playgroud)

使用Map中的前两列,并在查找后计算最后一列.如何安全地增加java.sql.Timestamp?

Adr*_*onk 48

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());
Run Code Online (Sandbox Code Playgroud)

这将正确地满足您的默认时区中的日光时间转换.如果需要,您可以告诉Calendar类使用不同的时区.


And*_*s B 9

Java 8

Timestamp old;
ZonedDateTime zonedDateTime = old.toInstant().atZone(ZoneId.of("UTC"));
Timestamp new = Timestamp.from(zonedDateTime.plus(14, ChronoUnit.DAYS).toInstant());
Run Code Online (Sandbox Code Playgroud)

  • 为什么需要 ZonedDateTime?`时间戳新 = Timestamp.from(old.toInstant().plus(14, ChronoUnit.DAYS));` (2认同)

Pet*_*rey 7

值得注意的是,14天并不总是14*24*3600秒.当您有夏令时,这可能会缩短一个小时或更长.从历史上看,它可能比这复杂得多.

相反,我建议使用JodaTime或日历来执行时区相关的计算.


Adm*_*vic 6

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);
}
Run Code Online (Sandbox Code Playgroud)