大纪元时间是自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
类来解决这个问题,但只想了解这种行为
答案 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;
它肯定会起作用。