2013-10-17 3 views
0

2000.01.01을 사용하는 외부 시스템과 시간을 변환합니다. 여러 계산에 대해 신기원부터 밀리 초가 필요하므로 상수를 사용하여 둘 사이를 변환합니다 (윤초 등의 뉘앙스는 무시하고 내 상수는 정확하지 않을 수 있지만 지금은 중요하지 않습니다). 테스트하는 동안 나는 시간 전환의 기이함을 발견했다.GregorianCalendar에서 획기적인 시간이 지나서

Calendar epoch = new GregorianCalendar(TimeZone.getTimeZone("Zulu")); 
epoch.set(2000,Calendar.JANUARY,1,0,0,0); 
System.out.println("EPOCH DIFF:"+(epoch.getTime().getTime()-946684800000L)); 

이렇게하면 항상 같은 결과가 나타납니다. 다시 새로운 VM에서 실행하지만 경우

for(int i = 0; i < 10; i++) { 
     System.out.println("EPOCH DIFF:"+(epoch.getTime().getTime()-946684800000L)); 
    } 

(RESULT: -400) 

을 다시 값이 (겉으로는) 무작위로 계속 변화 : 그리고 그것은 당신이 루프에서 실행하는 경우 않습니다! 난 그냥 서로 다른의 JVM에서 연속으로 5 회를 실행하고 다른 결과를 얻을 : 나는 다른 시간대 테스트를 다시 실행 한

-276 
-612 
-376 
-458 
-573 

과 같은 문제를 얻을.

누군가이 문제를 일으킬 수있는 아이디어가 있습니까?

답변

2

달력 개체 시간의 정밀도는 밀리 초입니다. 여러 실행에서 동일 차이를 얻기 위해 다음과 같이 설정 epoch.set(2000,Calendar.JANUARY,1,0,0,0) 방법에있어서, 밀리 초 값이 별도로 제로에 동일하게 설정할 수 있습니다 0

으로 재설정되지 않습니다

epoch.set(Calendar.MILLISECOND, 0) 
+0

Argghh 그럴 수 없어 내가 그걸 놓쳤다 고 생각해. 감사. –

관련 문제