【问题标题】:Shifted Java Date is in the past移位的 Java 日期是过去的
【发布时间】:2026-01-07 20:20:08
【问题描述】:

我有一个我无法理解的问题 - 如果我添加的天数超过 24 天,则偏移日期为过去。

long start = System.currentTimeMillis();
long shift = 3600000 * 24 * 24;
System.out.println(new Date(start));
System.out.println(new Date(start + shift));

24 天轮班:

start - Wed Apr 18 11:37:12 CEST 2012
end - Sat May 12 11:37:12 CEST 2012

25 天轮班:

start - Wed Apr 18 11:37:55 CEST 2012
end - Sat Mar 24 17:35:08 CET 2012

有人能告诉我为什么它会这样吗?谢谢。

【问题讨论】:

    标签: java date time shift


    【解决方案1】:

    您正在执行整数乘法,然后将结果转换为长整数。乘法溢出,所以结果是否定的。

    使用以下代码进行长乘:

    long shift = 3600000L * 24 * 24;
    

    【讨论】:

    • 哎呀,我的错,经过几次检查我都没有看到这个。谢谢。
    【解决方案2】:

    我真的建议不要以这种方式解决您的问题;改用 java.util.Calendar。它更有可能应对夏令时更改等极端情况,而且 API 更好。

    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date(start));
    cal.add(Calendar.DAY_OF_MONTH, 24)
    Date shifted = cal.getTime();
    

    【讨论】:

      【解决方案3】:

      也许你应该只使用 java.util.Calendar 如下:

      Calendar c = GregorianCalendar.getInstance(); //time default to now
      c.add(Calendar.DATE, 24); //adds 24 days
      Date end = c.getTime();
      

      【讨论】: