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

我有一个应用程序,它将一个时间戳作为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 

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

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

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

 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类使用不同的时区。

 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); } 

Java 8

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