2011-12-19 40 views
0

我遇到了日历后的方法怪异的错误。下面的代码需要当前时间,并且应该在同一时间返回明天的日期。当您使用当前时间运行代码时,会发生此错误。任何想法发生了什么?Java日历的方法返回不一致的结果 - 任何想法?

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

} 

结果:

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 
+0

为什么你要传递对象的矢量,解析字符串等?你的测试代码看起来比它应该更复杂。你为什么要执行11次? – 2011-12-19 16:02:27

+0

你知道日历有一个'.add()'方法吗? – fge 2011-12-19 16:06:30

+0

@fge:他或她在说,所以是的,我会说他的确如此。 :-) – ruakh 2011-12-19 16:11:33

回答

3

这不是一个错误。 Calendar.after(...)执行严格不等式,而Calendar只存储毫秒精度。 (对于这个问题,我甚至不确定是否保证在所有系统上都精确到毫秒级;我相信有些系统不允许软件访问那些很小的时间差值,但通常是毫秒)。如果dateTest(...)的两个调用Calendar.getInstance()发生在同一毫秒内,则Calendar.after(...)将返回false,并且dt.add(Calendar.DAY_OF_YEAR, +1)将不会执行。

+0

即使每秒睡眠循环以每秒钟运行dateTest(),该错误依然存在。 – kirbs 2011-12-19 17:33:28

+0

@ kirbs:对不起,但我不认为你理解我的答案。 (除非是我不理解你的回复。)'dateTest(...)'的第一行是'Calendar dt = Calendar.getInstance();',然后'dateTest(...)'检查if (Calendar.getInstance()。之后(DT))'。这是两条线在同一毫秒内执行有问题。如果你想通过插入一个'Thread.sleep(...)'来解决这个问题,那么你需要将它插入这两行之间的某处。 – ruakh 2011-12-19 17:47:43

+0

你是对的,我的坏。我没有意识到()后两个日历实例的比较是从纪元毫秒。谢谢! – kirbs 2011-12-19 17:59:15