Java日历';s after方法返回不一致的结果——有什么想法吗?

Java日历';s after方法返回不一致的结果——有什么想法吗?,java,debugging,Java,Debugging,我在Calendar的after方法中遇到了一个奇怪的错误。下面的代码采用当前时间,并应返回明天的日期和相同的时间。当您使用当前时间运行代码时,就会发生错误。知道发生了什么事吗 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Vector; public class NextDateTest { public static void main(String[] args) {

我在Calendar的after方法中遇到了一个奇怪的错误。下面的代码采用当前时间,并应返回明天的日期和相同的时间。当您使用当前时间运行代码时,就会发生错误。知道发生了什么事吗

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Vector;

public class NextDateTest {

    public static void main(String[] args) {

        Vector<Object> setup = new Vector<Object>();
        Calendar dt = Calendar.getInstance();
        SimpleDateFormat hour = new SimpleDateFormat("HH");
        SimpleDateFormat minute = new SimpleDateFormat("mm");

        setup.add(hour.format(dt.getTime()));
        setup.add(minute.format(dt.getTime()));

        for(int a=0; a<11; a++){
            dateTest(setup);
        }

    }

    static void dateTest(Vector<Object> vec){
        Calendar dt = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm");
        System.out.println("Old time:" + format.format(dt.getTime()));

        dt.set(Calendar.HOUR_OF_DAY, Integer.valueOf((String) vec.elementAt(0)));
        dt.set(Calendar.MINUTE, Integer.valueOf((String) vec.elementAt(1)));
        System.out.println(Calendar.getInstance().after(dt));
        if(Calendar.getInstance().after(dt)){
            dt.add(Calendar.DAY_OF_YEAR, +1);
        }           
        System.out.println("New time:" + format.format(dt.getTime()));  
    }

}


这不是虫子
Calendar.after(…)
执行严格的不等式,
Calendar
仅存储毫秒精度。(就此而言,我甚至不确定在所有系统上是否保证精确到毫秒;我相信有些系统不允许软件访问如此小的时间增量。但毫秒是典型的。)因此如果
dateTest(…)
Calendar.getInstance()
的两个调用发生在同一毫秒内,然后,
Calendar.after(…)
将返回
false
,并且
dt.add(Calendar.DAY\u OF\u YEAR,+1)
将不会执行。

这不是错误
Calendar.after(…)
执行严格的不等式,
Calendar
仅存储毫秒精度。(就此而言,我甚至不确定在所有系统上是否保证精确到毫秒;我相信有些系统不允许软件访问如此小的时间增量。但毫秒是典型的。)因此如果
dateTest(…)
Calendar.getInstance()
的两个调用发生在同一毫秒内,然后,
Calendar.after(…)
将返回
false
,并且
dt.add(Calendar.DAY\u OF\u YEAR,+1)
将不会执行。

为什么要传递对象向量、解析字符串等?您的测试代码看起来比应该的复杂得多。为什么要执行11次?你知道日历有一个
.add()
方法吗?@fge:他或她正在调用它,所以是的,我想说他有。:-)@乔恩:代码可以简化。我从另一个开发人员那里继承了这一点。我没有费心重新编写源对象。循环显示错误;dateTest()在完整的代码中只被调用一次。@kirbs:如果您需要更多帮助,请自己多做些努力。给我们一个你能写的最简单但完整的程序来演示这个问题。你为什么要传递对象的向量,解析字符串等等?您的测试代码看起来比应该的复杂得多。为什么要执行11次?你知道日历有一个
.add()
方法吗?@fge:他或她正在调用它,所以是的,我想说他有。:-)@乔恩:代码可以简化。我从另一个开发人员那里继承了这一点。我没有费心重新编写源对象。循环显示错误;dateTest()在完整的代码中只被调用一次。@kirbs:如果您需要更多帮助,请自己多做些努力。给我们一个你能写的最简单的简短但完整的程序来演示这个问题。这个错误仍然存在,即使你每秒钟都在运行dateTest()。@kirbs:对不起,我想你不明白我的答案。(除非是我不明白你的回答。)
dateTest(…)
的第一行是
Calendar dt=Calendar.getInstance()
,然后稍后
dateTest(…)
检查
if(Calendar.getInstance().after(dt))
。有问题的是,这两行代码在同一毫秒内执行。如果你想通过插入一个
线程来解决这个问题。sleep(…)
,那么你需要将它插入这两行之间的某个地方。你说得对,我的错。我没有意识到after()以毫秒为单位对两个日历实例进行比较。谢谢即使每秒休眠循环以每秒运行dateTest(),错误仍然存在。@kirbs:对不起,但我认为你不明白我的答案。(除非是我不明白你的回答。)
dateTest(…)
的第一行是
Calendar dt=Calendar.getInstance()
,然后稍后
dateTest(…)
检查
if(Calendar.getInstance().after(dt))
。有问题的是,这两行代码在同一毫秒内执行。如果你想通过插入一个
线程来解决这个问题。sleep(…)
,那么你需要将它插入这两行之间的某个地方。你说得对,我的错。我没有意识到after()以毫秒为单位对两个日历实例进行比较。谢谢
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38
Old time:12/19/2011 10:38
false
New time:12/19/2011 10:38
Old time:12/19/2011 10:38
true
New time:12/20/2011 10:38