Java日历';s after方法返回不一致的结果——有什么想法吗?
我在Calendar的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) {
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