import java.util.Date;public class Test1 {
    public static void main(String []args){
        Date now = new Date();
        Date start = addMinutes(now, 24 * 60 * -1);
        Date end = addMinutes(start, 24 * 60 * -1);
        System.out.println(now);
        System.out.println(start);
        System.out.println(end);
    }    public static Date addMinutes(Date sendDate, int n) {        Date tmp = (Date) sendDate.clone();
        try {
            tmp.setMinutes(sendDate.getMinutes() + n);
        } catch (Exception e) {
            return null;
        }
        return tmp;    }
}正确答案应该是 now > start > end,但实际的输入结果start == end,然后以debug运行时,在 Date end = addMinutes(start, 24 * 60 * -1)打断点时,又输出正常,请问这是什么原因呢?求大佬解释

解决方案 »

  1.   

    Date.setMinutes()方法已经过时了,可能存在问题。可以使用Calendar.set(Calendar.MINUTE, n);替代。public class DateTest {
        public static void main(String []args){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date now = new Date();
            Date start = addMinutes(now, 24 * 60 * -1);
            Date end = addMinutes(start, 24 * 60 * -1);
            System.out.println(sdf.format(now) + "," +now.hashCode());
            System.out.println(sdf.format(start) + "," +start.hashCode());
            System.out.println(sdf.format(end) + "," +end.hashCode());
        }    public static Date addMinutes(Date sendDate, int n) {        Date tmp = (Date) sendDate.clone();
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(tmp);
            calendar.set(Calendar.MINUTE, n);//        try {
    //            tmp.setMinutes(sendDate.getMinutes() + n);
    //        } catch (Exception e) {
    //            return null;
    //        }
            return calendar.getTime();    }
    }
      

  2.   

    把tmp.setMinutes(sendDate.getMinutes() + n);改成tmp.setMinutes(tmp.getMinutes() + n);也可以正常输出。import java.util.Date;
     
    public class Test1 {
        public static void main(String []args){
            Date now = new Date();
            Date start = addMinutes(now, 24 * 60 * -1);
            Date end = addMinutes(start, 24 * 60 * -1);
            System.out.println(now);
            System.out.println(start);
            System.out.println(end);
        }
     
        public static Date addMinutes(Date sendDate, int n) {
     
            Date tmp = (Date) sendDate.clone();
            try {
                tmp.setMinutes(tmp.getMinutes() + n);
            } catch (Exception e) {
                return null;
            }
            return tmp;
     
        }
    }
      

  3.   

    神奇了!在addMinutes里面加上一行System.out输出:System.out.println(sendDate.hashCode());也能正常输出!!!
    public class DateTest {
        public static void main(String []args){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date now = new Date();
            Date start = addMinutes(now, 24 * 60 * -1);
            Date end = addMinutes(start, 24 * 60 * -1);
            System.out.println(sdf.format(now) + "," +now.hashCode());
            System.out.println(sdf.format(start) + "," +start.hashCode());
            System.out.println(sdf.format(end) + "," +end.hashCode());
        }    public static Date addMinutes(Date sendDate, int n) {
            System.out.println(sendDate.hashCode());
            Date tmp = (Date) sendDate.clone();
    //        Calendar calendar = Calendar.getInstance();
    //        calendar.setTime(tmp);
    //        calendar.set(Calendar.MINUTE, n);        try {
                tmp.setMinutes(sendDate.getMinutes() + n);
            } catch (Exception e) {
                return null;
            }
    //        return calendar.getTime();
            return tmp;
        }
    }有哪位大神,这在内存中发生了什么?
      

  4.   

    public static Date addMinutes(Date sendDate, int n) {
     
            Date tmp =sendDate;
            try {
                tmp.setMinutes(sendDate.getMinutes() + n);
            } catch (Exception e) {
                return null;
            }
            return tmp;
     
        }