2011-07-29 2 views
1

..왜 내 날짜 차이 함수가 임의로 잘못된 값을 유출합니까? 내가 계산하고 두 날짜 사이의 차이를 반환하려면 다음 코드를 사용하고

/** 
* Calculate the absolute difference between two Date without 
* regard for time offsets 
* 
* @param d1 Date one 
* @param d2 Date two 
* @return The fields day, hour, minute, second and millisecond 
*/ 
public static long[] getTimeDifference(Date d1, Date d2) { 
    long[] result = new long[7]; 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(d1); 

    long t1 = cal.getTimeInMillis(); 
    cal.setTime(d2); 

    long diff = Math.abs(cal.getTimeInMillis() - t1); 
    long diffms = diff; 


    final int ONE_SECOND = 1000; 
    final int ONE_MINUTE = ONE_SECOND * 60; 
    final int ONE_HOUR = ONE_MINUTE * 60; 
    final int ONE_DAY = ONE_HOUR * 24; 
    final int ONE_WEEK = ONE_DAY * 7; 

    long w = diff/ONE_WEEK; 
    diff %= ONE_WEEK; 

    long d = diff/ONE_DAY; 
    diff %= ONE_DAY; 

    long h = diff/ONE_HOUR; 
    diff %= ONE_HOUR; 

    long m = diff/ONE_MINUTE; 
    diff %= ONE_MINUTE; 

    long s = diff/ONE_SECOND; 

    long ms = diff % ONE_SECOND; 

    result[0] = w; 
    result[1] = d; 
    result[2] = h; 
    result[3] = m; 
    result[4] = s; 
    result[5] = ms; 
    result[6] = diffms; 

    Log.d("FTT", result[0] + "w, " + result[1] + "d, " + result[2] + "h, " + result[3] + "m, " + result[4] + "s, " + result[5] + "ms, " + result[6] + " diffms, " + "time1: " + t1 +", time2:" + cal.getTimeInMillis()); 
    return result; 
} 

코드는 이제 모든 제외하고, 완벽하게 작동하고, 무작위, 그것은 잘못된 값을 그대로 출력한다. 위에서 볼 수 있듯이

07-28 17:20:29.225: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 30s, 772ms, 82470772 diffms, time1: 1311981300000, time2:1311898829228 
07-28 17:20:30.226: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 29s, 773ms, 82469773 diffms, time1: 1311981300000, time2:1311898830227 
07-28 17:20:31.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 28s, 772ms, 82468772 diffms, time1: 1311981300000, time2:1311898831228 
07-28 17:20:32.226: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 27s, 773ms, 82467773 diffms, time1: 1311981300000, time2:1311898832227 
07-28 17:20:33.226: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 26s, 772ms, 82466772 diffms, time1: 1311981300000, time2:1311898833228 
07-28 17:20:34.227: DEBUG/FTT(2095): 7w, 1d, 15h, 57m, 13s, 67ms, 4377433067 diffms, time1: 1311981300000, time2:1311898834229 
07-28 17:20:35.223: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 24s, 771ms, 82464771 diffms, time1: 1311981300000, time2:1311898835229 
07-28 17:20:36.228: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 23s, 770ms, 82463770 diffms, time1: 1311981300000, time2:1311898836230 
07-28 17:20:37.225: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 22s, 769ms, 82462769 diffms, time1: 1311981300000, time2:1311898837231 
07-28 17:20:38.229: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 21s, 769ms, 82461769 diffms, time1: 1311981300000, time2:1311898838231 
07-28 17:20:39.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 20s, 768ms, 82460768 diffms, time1: 1311981300000, time2:1311898839232 
07-28 17:20:40.233: DEBUG/FTT(2095): 7w, 1d, 15h, 57m, 7s, 65ms, 4377427065 diffms, time1: 1311981300000, time2:1311898840231 
07-28 17:20:41.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 18s, 768ms, 82458768 diffms, time1: 1311981300000, time2:1311898841232 
07-28 17:20:42.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 17s, 768ms, 82457768 diffms, time1: 1311981300000, time2:1311898842232 
07-28 17:20:43.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 16s, 766ms, 82456766 diffms, time1: 1311981300000, time2:1311898843234 
07-28 17:20:44.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 15s, 766ms, 82455766 diffms, time1: 1311981300000, time2:1311898844234 
07-28 17:20:45.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 14s, 765ms, 82454765 diffms, time1: 1311981300000, time2:1311898845235 
07-28 17:20:46.234: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 13s, 765ms, 82453765 diffms, time1: 1311981300000, time2:1311898846235 
07-28 17:20:47.234: DEBUG/FTT(2095): 7w, 1d, 15h, 57m, 0s, 60ms, 4377420060 diffms, time1: 1311981300000, time2:1311898847236 
07-28 17:20:48.235: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 11s, 763ms, 82451763 diffms, time1: 1311981300000, time2:1311898848237 
07-28 17:20:49.235: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 10s, 763ms, 82450763 diffms, time1: 1311981300000, time2:1311898849237 
07-28 17:20:50.234: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 9s, 764ms, 82449764 diffms, time1: 1311981300000, time2:1311898850236 
07-28 17:20:51.234: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 8s, 763ms, 82448763 diffms, time1: 1311981300000, time2:1311898851237 
07-28 17:20:52.236: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 7s, 763ms, 82447763 diffms, time1: 1311981300000, time2:1311898852237 

이 세 로그 라인이 일치하지 않는 값을 보여줍니다 (Log.d/w) 위의 코드의 끝 부분에서 만든 초마다 업데이트 된 다음 로그를 참조하십시오. 그것은 시간 1과 TIME2 잘처럼 나에게보고, 왜 이런 일이 수에 관한 두 ..

long diff = Math.abs(cal.getTimeInMillis() - t1); 

모든 아이디어의 차이를받을 때 문제가 발생합니다? 나는 내 두뇌를 망 쳤어 그것을 알아낼 수 없다.

+0

코드를 살펴본 이유가 무엇입니까? –

+0

입력 (예 : 'd1' 및'd2')을 모른 채 아무도 질문에 답변 할 수 없습니다. 그러나 문제가이 기능의 외부에있는 것처럼 보입니다. – shinkou

+0

라인 07-28에 대해 17:20:34.227 : DEBUG/FTT (2095) : 올바르게 이해하면 diffms = abs (time1-time2) = 1311981300000-1311898834229 = 82465771! = 4377433067입니다. 물론 당신의 다른 가치들도 엉망이 될 것입니다. – emory

답변

0

Math.abs의 javadocs에서 : "인수가 Long.MIN_VALUE 값과 동일한 경우, 가장 부정적인 표현 가능한 long 값은 결과가 음수 인 동일한 값입니다."

(cal.getTimeInMillis() - t1)의 결과가 Long.MIN_VALUE이면 모듈러스 연산에서 음수 값을 사용합니다. Afaik, 그렇게하면 예기치 않은 결과가 발생할 수 있습니다.

+0

하지만 Long.MIN_VALUE -9223372036854775808L에 가깝지 않습니다. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Long.html#MIN_VALUE – kefs