2013-06-18 3 views
25

여기서 물어 본 것과 매우 유사한 것을 다루고 있습니다. - compare Joda-Time time zones하지만 나에게는 적합하지 않습니다. 나는 위의 두 SYSOUT 문에서 'false'로 얻을 흥미롭게두 개의 Joda-Time DateTime 오브젝트 비교하기

DateTime estDT = new DateTime(DateTimeZone.forID("America/Puerto_Rico")).withMillisOfSecond(0); 
DateTime londonDT = new DateTime(DateTimeZone.forID("Europe/London")).withMillisOfSecond(0); 

    System.out.println("Comparison " + londonDT.isBefore(estDT)); 
    System.out.println("Comparison " + londonDT.isAfter(estDT)); 

-

여기에 내가 함께 Joda-TimeDateTime을 테스트입니다 코드 조각입니다. 누구든지이 비교를 수행하는 올바른 방법이 무엇인지 설명해 주시겠습니까?

답변

14

시간대가 같지만 시간대가 서로 다른 두 개의 DateTime 인스턴스를 만들 것입니다. 둘 다 앞이나 뒤에 있지 않습니다.

시간대는 getHourOfDay()과 같은 날짜/시간 방법이 순간을 어떻게 변환하는지에 영향을줍니다.

+1

같다. 두 개의 코드 라인은 컴퓨터 시계의 두 가지 샘플링을 의미하므로 두 번째 라인은 첫 번째 라인보다 늦게 발생했습니다. DateTime은 밀리 초의 해상도를 가지고 있기 때문에 두 코드 줄이 컴퓨터의 시계와 동일한 밀리 초 내에 실행되면 서로 동일하게됩니다. 이것은 순수 운 (기회)입니다. Java 스레드가 실행 중에 지연/일시 중지되었는지 또는 더 느린 컴퓨터에서 실행되었는지에 따라이 두 DateTimes가 다를 수 있습니다. –

+0

우리 둘 다 너무 강했습니다. withMillisOfSecond (0)를 호출하면 두 개의 * 아마 같은 시간을 나타낼 것입니다. 그러나 다른 초 (예 : millis = 999 및 millis = 0)에서 실행되는 경우 다를 수 있습니다. 똑같은 시간이 실제로 필요하다면, withZone() 메소드는 순간을 두 번 얻는 것보다 더 신뢰할 수 있습니다. 그러나 OP가 입력으로 제공되는 두 가지 다른 인스턴스를 제 시간에 원하는 경우가 많습니다. –

44

isAfterisBefore은 밀리 초 (시간대 무시)와 날짜를 비교합니다.

예에서 날짜는 밀리 초입니다.

System.out.println(londonDT.getMillis() == estDT.getMillis()); 

true입니다.

식은

londonDT.isBefore(estDT) 
londonDT.isAfter(estDT) 

는 londonDT 우주의 타임 라인상의 지점으로 잠시 후에 * * estDT이고, 기술적

londonDT.getMillis() < estDT.getMillis() 
londonDT.getMillis() > estDT.getMillis() 
관련 문제