2012-03-07 3 views
13

Có cách nào chỉ có ngày so với Ngày giờ đối tượng với isBefore có hoạt động không?Ngày chỉ so sánh sử dụng "isBefore" trong Java Joda Time

Đối với ex.,

DateTime start = new DateTime(Long.parseLong(<someInput>)); 
DateTime end = new DateTime(Long.parseLong(<someInput>)); 

Bây giờ khi tôi làm,

while (start.isBefore(end)) { 
    // add start date to the list 
    start = start.plusDays(1); 
} 

Điều này dẫn đến hành vi không phù hợp (đối với kịch bản của tôi) vì nó có tính đến thời gian xem xét là tốt trong khi những gì tôi muốn là chỉ có những ngày so sánh bằng cách sử dụng isBefore. Có cách nào tôi có thể làm điều đó không?

Vui lòng cho tôi biết.

Cảm ơn!

Trả lời

21

Nếu bạn chỉ muốn so sánh ngày, bạn có thể muốn sử dụng lớp LocalDate, thay vì DateTime.

Các tài liệu JodaTime là khá tốt: http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html

+0

Cảm ơn bạn đã trả lời. Tôi muốn lưu trữ DateTime bên trong vòng lặp để thay vì chuyển đổi DateTime thành LocalDate và sau đó chuyển đổi LocalDate trở lại DateTime, tôi nghĩ rằng tốt hơn nên sử dụng DateFormatter. – test123

+1

Chỉ cần chắc chắn rằng bạn không có bất kỳ hành vi kỳ lạ nào khi vào/rời khỏi thời gian tiết kiệm ánh sáng ban ngày! Ngày và giờ thường phức tạp hơn lần đầu tiên xuất hiện ... –

+1

Tôi vừa đánh giá lại các trường hợp sử dụng cho ứng dụng của mình và có vẻ như tôi sẽ sử dụng LocalDate tốt hơn. Cảm ơn! – test123

1

Chuyển sang sử dụng LocalDate thay vì Ngày giờ. Khái niệm trong JodaTime là một phần '' (xem giao diện ReadablePartial).

+0

Cảm ơn bạn đã trả lời. Tôi muốn lưu trữ định dạng DateTime chỉ bên trong vòng lặp. Vì vậy, tôi nghĩ rằng tôi sẽ gắn bó với những gì George đề nghị dưới đây. Cảm ơn! – test123

0

Bạn có thể thiết lập thời gian của DateTime bằng không (có nghĩa là nửa đêm) sau khi phân tích cú pháp:

// withTime sets hours, minutes, seconds, milliseconds 
DateTime start = new DateTime(Long.parseLong(<someInput>)).withTime(0, 0, 0, 0); 
DateTime end = new DateTime(Long.parseLong(<someInput>)).withTime(0, 0, 0, 0); 

Hoặc sử dụng một trong các lớp Joda Thời gian khác ; có nhiều hơn DateTime! Nếu bạn chỉ giao dịch với ngày tháng, có thể bạn sẽ muốn sử dụng LocalDate thay vì DateTime.

+0

Cảm ơn bạn đã trả lời! Sau khi xem xét kỹ hơn ứng dụng của tôi, tôi nghĩ tôi sẽ thay đổi nó thành LocalDate thay vì DateTime. Cảm ơn! – test123

+2

Đặt thời gian thành nửa đêm sẽ không hoạt động nếu múi giờ có khoảng trống tiết kiệm ánh sáng ban ngày bao gồm nửa đêm. Gọi 'dayOfMonth(). RoundFloorCopy()' xử lý trường hợp cạnh. – JodaStephen

8

Một chiến lược khác là định dạng nó.

DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
DateTime newStart = df.parse(start); 
DateTime newEnd = df.parse(end); 

while (newStart.isBefore(newEnd)) { 
    // add start date to the list 
    newStart = newStart.plusDays(1); 
}  
+0

Điều này gần nhất với những gì tôi muốn. Cảm ơn nhiều vì gợi ý! – test123

+0

df.parse không chấp nhận DateTime :-( – test123

+0

Hãy thử df.parse (start.toString()); – JCab