2012-02-05 45 views
40

Tôi muốn tạo khoảng thời gian giữa đầu tuần và cuối tuần hiện tại.Jodatime bắt đầu ngày và cuối ngày

Tôi có đoạn code sau, vay mượn từ this answer:

private LocalDateTime calcNextSunday(LocalDateTime d) { 
    if (d.getDayOfWeek() > DateTimeConstants.SUNDAY) { 
     d = d.plusWeeks(1); 
    } 
    return d.withDayOfWeek(DateTimeConstants.SUNDAY); 
} 

private LocalDateTime calcPreviousMonday(LocalDateTime d) { 
    if (d.getDayOfWeek() < DateTimeConstants.MONDAY) { 
     d = d.minusWeeks(1); 
    } 
    return d.withDayOfWeek(DateTimeConstants.MONDAY); 
} 

Nhưng bây giờ tôi muốn thứ Hai LocalDateTime có mặt tại 00:00:00, và chủ nhật LocalDateTime tại 23:59:59. Làm thế nào tôi sẽ làm điều này?

Trả lời

20

Làm thế nào về:

private LocalDateTime calcNextSunday(LocalDateTime d) { 
    return d.withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withDayOfWeek(DateTimeConstants.SUNDAY); 
} 

private LocalDateTime calcPreviousMonday(final LocalDateTime d) { 
    return d.withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).withDayOfWeek(DateTimeConstants.MONDAY); 
} 
+4

'setXxx' theo quy ước không có kiểu trả về trong Java vì vậy nó sẽ không cho phép chaining. Điều này ở đây nhắc nhở các mô hình xây dựng (mà ban đầu sẽ không làm việc trên một đối tượng hiện có). –

+1

Thật vậy. Điều này cho phép bạn chuỗi các cuộc gọi với nhau, thay vì có tất cả chúng trên các dòng khác nhau và mang lại cho bạn tất cả các lợi ích của các đối tượng bất biến. –

+0

Tôi nghĩ rằng "mẫu" được gọi là "Giao diện thông thạo" http://martinfowler.com/bliki/FluentInterface.html - mang lại nhiều lợi ích về khả năng đọc và rõ ràng theo ý kiến ​​của tôi. –

127

Bạn có thể sử dụng phương pháp withTime:

d.withTime(0, 0, 0, 0); 
d.withTime(23, 59, 59, 999); 

Tương tự như câu trả lời Phêrô, nhưng ngắn hơn.

+39

Bắt đầu từ ngày cũng có thể nhận được với _d.withTimeAtStartOfDay() _ – Touko

+12

'withTimeAtStartOfDay()' không có sẵn cho 'LocalDateTime', nhưng nó có sẵn cho [' DateTime'] (http: //joda-time.sourceforge .net/apidocs/org/joda/time/DateTime.html # withTimeAtStartOfDay()) – Abdull

+0

+1. Một lưu ý: 'LocalDateTime là không thay đổi, do đó không có phương thức thiết lập nào. Thay vào đó, phương thức này trả về một cá thể mới với giá trị của mili giây thay đổi.' Vì vậy, bạn phải gán kết quả cho một số biến. – informatik01

65

cũng là một cách đơn giản là

d.millisOfDay().withMaximumValue();

+10

Đây phải là câu trả lời được chấp nhận, so với các câu trả lời khác là tốt nhất về hiệu suất (ít đối tượng được tạo ra như DateTime là không thể thay đổi). Phương thức withMaximunValue Documentation thậm chí còn nói là cách tốt nhất để thực hiện câu hỏi là yêu cầu – le0diaz

+0

Sự khác biệt với 'getMaximumValueOverall' là gì? –

Các vấn đề liên quan