2013-06-18 30 views
25

Tôi đang đối phó với một cái gì đó rất giống với những gì đã được yêu cầu ở đây - compare Joda-Time time zones nhưng nó dường như không làm việc cho tôi.So sánh hai đối tượng DateTime Thời gian Joda

Dưới đây là một đoạn mã mà tôi đang thử nghiệm Joda-TimeDateTime với -

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)); 

Điều thú vị là đủ, tôi nhận được 'false' từ cả những điều khoản sysout trên. Bất cứ ai có thể vui lòng giải thích những gì sẽ là đúng cách để làm so sánh này?

Trả lời

14

Bạn đang tạo hai phiên bản DateTime có thể đại diện cho cùng một thời điểm, nhưng với các múi giờ khác nhau. Không phải là trước hoặc sau khác.

Múi giờ chỉ ảnh hưởng đến cách thức các phương pháp ngày/giờ như getHourOfDay() chuyển đổi tức thời kịp thời.

+1

Về mặt kỹ thuật, londonDT đại diện cho một thời điểm * sau * estDT như điểm trên timeline của vũ trụ. Hai dòng mã riêng biệt có nghĩa là hai mẫu riêng biệt của đồng hồ của máy tính, do đó, dòng thứ hai xảy ra muộn hơn ngày 1. DateTime có độ phân giải mili giây, vì vậy nếu cả hai dòng mã đó xảy ra trong cùng một phần nghìn giây của đồng hồ của máy tính thì chúng sẽ bằng nhau. Đây là may mắn (cơ hội). Tùy thuộc vào việc chuỗi Java đã bị trì hoãn/bị treo trong khi thực hiện hay chưa, hoặc nếu nó chạy trên một máy tính chậm hơn thì hai DateTimes đó có thể khác nhau. –

+0

Cả hai chúng tôi đều hơi mạnh. Hai * có thể * đại diện cho cùng một tức thời trong thời gian, cho các cuộc gọi đến withMillisOfSecond (0). Tuy nhiên, chúng có thể khác nhau, nếu chúng xảy ra vào các giây khác nhau (ví dụ: millis = 999 và millis = 0). Nếu cùng một thời điểm thực sự mong muốn, phương thức withZone() sẽ đáng tin cậy hơn là nhận được ngay lập tức hai lần. Tuy nhiên, nhiều khả năng OP sẽ muốn hai trường hợp khác nhau trong thời gian, được cung cấp như đầu vào. –

44

isAfterisBefore phương pháp so sánh ngày theo millis (bỏ qua múi giờ).

Trong ví dụ của bạn, các ngày có số mill bằng nhau.

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

sẽ in true.

Expressions

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

đều bình đẳng để

londonDT.getMillis() < estDT.getMillis() 
londonDT.getMillis() > estDT.getMillis()