2012-12-07 14 views
25

Tôi muốn so sánh hai ngày, tuy nhiên tôi đang gặp sự cố. 1 ngày được tạo từ một đối tượng java.util.date và một ngày khác được tạo thủ công. Mã sau là ví dụ:So sánh hai ngày sử dụng thời gian Joda

Date ds = new Date(); 
DateTime d = new DateTime(ds); 

DateTime e = new DateTime(2012,12,07, 0, 0); 
System.out.println(d.isEqual(e)); 

Tuy nhiên, thử nghiệm sẽ tắt false. Tôi đoán rằng đó là vì thời gian. Làm cách nào để kiểm tra xem hai ngày này có bằng nhau không (nghĩa là Năm, tháng, ngày giống nhau)?

+0

FYI, các [Joda-Time] (http://www.joda.org/joda-time/) dự án hiện đang trong [chế độ bảo trì] (https://en.wikipedia.org/wiki/Maintenance_mode), với nhóm tư vấn di chuyển đến [java.time] (http : //docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) các lớp học. Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Trả lời

44
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight())); 

hoặc

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay())); 
+5

toDateMidnight() không được dùng nữa và không nên sử dụng.Thay vào đó, withTimeAtStartOfDay() có thể được sử dụng, nhưng nó vẫn không tối ưu vì nó không loại bỏ múi giờ, vì vậy nếu hai ngày có các múi giờ khác nhau, chúng sẽ không bao giờ bằng nhau. – Stan

+3

Tôi sử dụng 'toLocalDate()', mà tôi cho rằng có cùng một vấn đề. Để tránh điều đó, tôi đoán bạn có thể chuỗi 'withZone() ', ví dụ:' d.toLocalDate(). IsEqual (e.withZone (d.zone) .toLocalDate()) '. Lưu ý rằng đây là _not_ được kiểm tra. –

+1

Điều này sẽ không hoạt động nếu d và e là múi giờ khác nhau. Câu trả lời của Charles Wood ở trên là đáng tin cậy hơn –

1

Vì chúng là đối tượng DateTime, các phần thời gian của chúng cũng được xem xét khi bạn so sánh chúng. Hãy thử đặt những phần thời gian kể từ ngày đầu tiên đến 0, như:

d = d.withTime(0, 0, 0, 0); 
-5

Viết phương pháp riêng của bạn

public boolean checkEqual(DateTime first,DateTime second){ 
    if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){ 
     return true; 
    } 
return false; 
} 
+0

Các loại giống nhau, đọc kỹ câu hỏi. Cả hai đều là DateTime. –

+2

Điều này là hoàn toàn không cần thiết vì Joda Time có một số phương pháp tiện ích làm chính xác loại điều này. –

3

Nếu bạn muốn bỏ qua các thành phần thời gian (nghĩa là bạn chỉ muốn so sánh ngày tháng), bạn có thể sử dụng lớp DateMidnight thay vì Date Time. Vì vậy, ví dụ của bạn sẽ trông giống như thế này:

Date ds = new Date(); 
DateMidnight d = new DateMidnight(ds); 

DateMidnight e = new DateMidnight(2012, 12, 7); 
System.out.println(d.isEqual(e)); 

Nhưng hãy cẩn thận, nó sẽ in "true" chỉ ngày hôm nay :)

Cũng lưu ý rằng theo mặc định JDK ngày và mọi tầng lớp ngay lập tức Joda-Time (DateTime và DateMidnight included) được xây dựng bằng múi giờ mặc định. Vì vậy, nếu bạn tạo một ngày để so sánh trong mã, nhưng lấy một số khác từ DB có thể lưu trữ ngày trong UTC, bạn có thể gặp phải sự mâu thuẫn giả sử bạn không ở múi giờ UTC.

+0

Ngày tháng hai trong thời gian gói không được đề xuất là sử dụng localDate –

+0

Tất cả các lớp và phương pháp liên quan đến nửa đêm không được dùng nữa, được thay thế bằng khái niệm và phương pháp "thời điểm đầu tiên trong ngày". –

15

Bạn nên sử dụng toLocalDate():

date1.toLocalDate().isEqual(date2.toLocalDate()) 

này sẽ thoát khỏi phần Time của DateTime.

Có cách tiếp cận khác, nhưng nó không chiếm trường hợp hai ngày có một múi giờ khác nhau, do đó, nó ít đáng tin cậy:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
0

Đây là một phương pháp tĩnh làm việc cho tôi.

public static boolean isSameDay(DateTime date1, DateTime date2){ 
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()); 
} 
+0

Tôi không thấy lợi thế của [Câu trả lời hiện tại] (https://stackoverflow.com/a/21553438/642706) bằng cách sử dụng 'toLocalDate'. Ngoại trừ trường hợp này không thành công nếu các đối tượng 'DateTime' có các múi giờ khác nhau trong khi cách tiếp cận của Câu trả lời khác thì không. Cho dù điều này là tốt hay xấu phụ thuộc vào vấn đề kinh doanh. –

-1
DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

obj1 và obj2 có thể là một String, Long, ngày (java.util) ... Đối với các chi tiết thấy http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

+1

Chào mừng bạn đến với Stack Overflow! Trước khi trả lời câu hỏi, luôn đọc câu trả lời hiện có. Câu trả lời này đã được cung cấp. Thay vì lặp lại câu trả lời, hãy bỏ phiếu cho câu trả lời hiện có. Một số hướng dẫn viết câu trả lời hay có thể tìm thấy tại đây (https://stackoverflow.com/help/how-to-answer). – dferenc