2011-12-19 2 views
0

나는 캘린더의 애프터 메쏘드에 이상한 버그를 발견했다. 아래 코드는 현재 시간을 가져와 같은 시간에 내일 날짜를 반환합니다. 이 버그는 현재 시간으로 코드를 실행할 때 발생합니다. 무슨 일이야?Java 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())); 
    } 

} 

결과 :

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 번이나 집행하니? –

+0

캘린더에'.add()'메소드가 있다는 것을 알고 계십니까? – fge

+0

@ fge : 그 또는 그녀는 그것을 부르고 있습니다. 그렇습니다. 나는 그랬다고 말하고 싶습니다. :-) – ruakh

답변

3

그것은 버그가 아니다. Calendar.after(...)은 부등식을 수행하고 Calendar은 밀리 초 정밀도 만 저장합니다. (그 점에 관해서는 비록 내가 이 모든 시스템에서 밀리 초의 정확성을 보장하는지 확신 할 수 없지만, 일부 시스템은 시간에 따른 소프트웨어 액세스를 제공하지 않는다고 생각합니다. 그러나 밀리 세컨드는 일반적입니다.) dateTest(...)Calendar.getInstance()에 대한 두 번의 호출이 동일한 밀리 초 내에 발생하면 Calendar.after(...)false을 반환하고 dt.add(Calendar.DAY_OF_YEAR, +1)은 수행되지 않습니다.

+0

매초마다 dateTest()를 실행하기 위해 루프를 잠자 게해도 버그가 계속 발생합니다. – kirbs

+0

@ kirbs : 미안하지만, 내 대답을 이해하지 못했다고 생각합니다. (당신의 대답을 이해하지 못하는 사람이 아닌 한)'dateTest (...)'의 첫번째 줄은'Calendar dt = Calendar.getInstance();'이고,'dateTest (...)'는'if (Calendar.getInstance(). after (dt))'를 호출합니다. 같은 밀리 초 안에 문제가되는 두 줄입니다. 'Thread.sleep (...) '을 삽입 해 이것을 처리하고 싶다면,이 두 줄 사이 어딘가에 삽입해야한다. – ruakh

+0

네 말이 맞아, 나쁘다. after()가 두 개의 Calendar 인스턴스를 한 시대에서 밀리 초로 비교 한 것을 알지 못했습니다. 감사! – kirbs

관련 문제