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

如何将java.sql.Timestamp增加14天?,java,sql,timestamp,increment,Java,Sql,Timestamp,Increment,我有一个应用程序,它以时间戳作为sql选择的开始日期和结束日期的边界,我想填充一个hashmap,从今年的第一个星期一开始的周数作为值,周数作为键。我发现使用时间戳真的很难,而且我对增加86400000秒来增加一天的时间感觉不太好,因为这并没有考虑闰日、小时、秒 我计划增加13天23小时59分59秒,这样我就可以按周在地图中查找开始日期作为键,然后使用开始日期获取结束日期 所以我想试着得到这样的东西: Week startDate endDate 1 2011

我有一个应用程序,它以时间戳作为sql选择的开始日期和结束日期的边界,我想填充一个hashmap,从今年的第一个星期一开始的周数作为值,周数作为键。我发现使用时间戳真的很难,而且我对增加86400000秒来增加一天的时间感觉不太好,因为这并没有考虑闰日、小时、秒

我计划增加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?

值得注意的是,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){
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);
}
长期结果=长期值(天*24*60*60*1000); 返回结果; } 公共时间戳addDays(整数天,时间戳t1)引发异常{ 如果(天数<0){ 抛出新异常(“日期格式错误”); } 长毫秒=dayToMiliseconds(天); 返回新的时间戳(t1.getTime()+毫秒); }
Java8

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

你唯一需要担心的问题是闰秒,而且每隔几年就会发生一次。如果你的程序从1970年开始运行,它将关闭24秒。您增加8640万秒的计划是完全可行的。使用Calendar或Joda如何?我想真正的问题是。。。您是否已将其识别为应用程序的阻止程序?如果你没有,那就去做吧。如果这是一个问题,它会出现,然后你可以解决它。这不是你问题的答案,而是一个尝试的建议:你提到时间戳被用作开始日期和结束日期的边界。与其在java中计算结束日期时间戳,然后将其传递到查询中,不如传递您拥有的开始日期时间戳,然后使用基于它的数据库日期/时间函数计算结束日期时间戳?您是否需要一个精确的、包含的
时间戳
?为什么不使用包含->排除范围(
日期
时间戳
)来代替?所以,
=startDate和
-然后再加上14天,你根本不用担心秒数……这真的重要吗?只要使用UTC,就不会遇到此问题。SQL通常不使用UTC。特别是如果你没有明确提到它,如果你使用GMT或任何没有夏令时的时区,这不是问题。我想标记14天可能包含一天没有24小时。Java不支持GMT那样的闰秒,但UTC支持。;)只有当您的虚拟机有更新的列表时,这才能正确解释夏令时。JodaTime允许使用一个标准源来实现这一点——据推测,这方面的VM更新历史上一直很慢。我怀疑更新速度慢的一个原因是“有进取心”的用户停留在至少10年的JVM上。。。另一方面,大多数操作系统都会保存一个包含所有所需信息的时区信息列表。jre应该真正使用它。在我的linux笔记本电脑上,它似乎一直设置到2499…它是
java.security.Timestamp
java.sql.Timestamp
?@EugeneA它是
java.sql.Timestamp
。为什么需要ZonedDateTime
Timestamp new=Timestamp.from(old.toInstant().plus(14,ChronoUnit.DAYS))