如果我尝试减去1到29天,则返回日期是正确的,但如果我尝试减去超过30天,则返回日期是错误的。谁能解释我哪里出错?
public class MapTesting {
public static void main(String[] args) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-dd-MM");
try {
Date date = ft.parse("2011-01-10");
Date su=new Date(date.getTime()-30*24*3600*1000);
System.out.println(su);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
答案 0 :(得分:8)
int constant中有溢出:30 * 24 * 3600 * 1000。
尝试将整数投入:
Date su=new Date(date.getTime() - 30 * 24 * 3600 * 1000L);
答案 1 :(得分:3)
这是因为Integer下溢/溢出。
当整数过高时,它会从正变为负。
示例:
System.out.println(24*24*3600*1000); // = 2073600000
System.out.println(25*24*3600*1000); // = -2134967296
当我们庆祝新的千禧年时,人们在99岁时溢出到00时也为此感到害怕。
要解决此问题,您可以将{1}中的一个数字转换为长整数。
答案 2 :(得分:2)
正如@ antonu17所提到的,你有溢出错误。
如果你想要比之前或之后的日期,你可以直接在日历对象上进行计算。
Calendar cal = Calendar.getInstance();
cal.add (Calendar.DAY_OF_MONTH, (-/+)30); //you can add - sign to 30 if you want current date -30 days.
然后从此日历对象中获取日期。
答案 3 :(得分:2)
Date构造函数需要一个long值。如果您指定长值,则代码有效:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MapTesting {
public static void main(String[] args) {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-dd-MM");
try {
Date date = ft.parse("2011-01-10");
Date su = new Date(date.getTime() - 30L * 24L * 3600L * 1000L);
System.out.println(su);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}