为什么减法超过30天导致错误答案

时间:2015-12-02 13:03:26

标签: java datetime

如果我尝试减去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();
        }

4 个答案:

答案 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();
        }
    }
}