为纪元时间添加天数[Java]

时间:2016-12-26 06:21:15

标签: java epoch

大纪元时间是自1970年1月1日以来经过的毫秒数,所以如果我想在那段时间内添加x天,那么添加相当于x天的毫秒数似乎很自然结果

Date date = new Date();
System.out.println(date);
// Adding 30 days to current time
long longDate = date.getTime() + 30*24*60*60*1000;
System.out.println(new Date(longDate));

它提供以下输出

Mon Dec 26 06:07:19 GMT 2016
Tue Dec 06 13:04:32 GMT 2016

我知道我可以使用Calendar类来解决这个问题,但只想了解这种行为

4 个答案:

答案 0 :(得分:5)

因为JVM正在将乘法值30 * 24 * 60 * 1000视为Int并且乘法结果超出整数范围它会给出结果: -1702967296意图为2592000000因此其给定日期小于当前日期

尝试以下代码:

public class Test {
public static void main(final String[] args) {
    Date date = new Date();
    System.out.println(date);
    // Adding 30 days to current time
    System.out.println(30 * 24 * 60 * 60 * 1000); // it will print -1702967296
    long longDate = (date.getTime() + TimeUnit.DAYS.toMillis(30));
    System.out.println(TimeUnit.DAYS.toMillis(30));
    date = new Date(longDate);
    System.out.println(date);
 }
}

答案 1 :(得分:2)

您的数字会出现整数溢出。 30 * 24 * 60 * 60 * 1000 = 2,592,000,000,大于有符号的32位整数可以容纳(2,147,483,647)。

使用long代替,将L附加到任何数字上:1000L,例如。

请注意,如果您想要处理夏令时(更不用说闰秒了!),这仍然是不够的。但是如果你愿意假设一天总是在24小时,那么使用多头会解决你的问题。 (时间是一件复杂的事情,我建议使用像joda或Java 8这样的库来为你处理它!)

答案 2 :(得分:0)

试试这个:

 DateTime timePlusTwoDays = new DateTime().plusDays(days);
 long longDate = timePlusTwoDays.getTime();
 System.out.println(new Date(longDate));

Dateime班有:

 public DateTime plusDays(int days) {
        if (days == 0) {
            return this;
        }
        long instant = getChronology().days().add(getMillis(), days);
        return withMillis(instant);
 }

答案 3 :(得分:0)

按如下方式编辑代码:

long longDate = date.getTime() + 30*24*60*60*1000L;

它肯定会起作用。