2011-12-19 69 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