2010-12-08 71 views
28

Thời gian Joda có một lớp là Interval, nằm trong khoảng từ DateTime s. Những gì có thể được sử dụng cho một phạm vi của LocalDate s?Khoảng thời gian LocalDate trong thời gian Joda

Tôi muốn một đối tượng đại diện, ví dụ "từ 1/1/2011 đến 10/1/2011", không có thời gian (hoặc múi giờ) bao giờ đi vào ảnh.

Theo tôi thấy, thời gian joda không có bất kỳ thứ gì được tích hợp cho điều đó. Nếu không tồn tại bất cứ điều gì cho nó, và chúng tôi sẽ tạo ra nó, nó sẽ trông như thế nào? Quan trọng nhất, giao diện nào từ thời gian joda có thể thực hiện để tích hợp tốt nhất vào các loại khác, phù hợp với thiết kế thời gian joda? Sẽ có ý nghĩa khi triển khai ReadableInterval, trong đó getStartgetEnd trả lại DateMidnight?

Trả lời

14

Lớp Interval đại diện cho một khoảng thời gian từ một phần nghìn giây tức thì sang một khoảnh khắc khác (hoàn thành với múi giờ). DateMidnight là một khoảnh khắc như vậy. Vì vậy, đề xuất của bạn thực hiện một khoảng thời gian cho DateMidnights là allready ở đó.

Interval i = new Interval(
    new DateMidnight(2010, 3, 2), new DateMidnight(2010, 3, 5)); 

i.contains(new DateTime(2010, 3, 1, 23, 59, 59, 999)); // == false 
i.contains(new DateTime(2010, 3, 2, 0, 0, 0, 0)); // == true 
i.contains(new DateTime(2010, 3, 4, 23, 59, 59, 999)); // == true 
i.contains(new DateTime(2010, 3, 5, 0, 0, 0, 0)); // == false 

Tuy nhiên, khái niệm khoảng thời gian tìm kiếm của bạn là LocalDates còn chưa là một phần (chưa có múi giờ). Nếu bạn đang thực hiện nó cho chính mình, không thực hiện bất kỳ giao diện khoảng thời gian nào cả. Nó sẽ can thiệp vào mong muốn của bạn, bởi vì nó được, như đã nói trước đây, dựa trên instant.

+0

Các lớp và phương thức liên quan đến nửa đêm được thay thế trong Joda-Time 2.3 theo phương thức 'withTimeAtStartOfDay'. –

7

EDIT: Rất tiếc, đã đọc sai trước đó.

Không, không có gì tương đương trong Thời gian Joda mà tôi biết.

Cá nhân tôi sẽ chỉ tạo lớp học của riêng mình bao gồm ngày bắt đầu và ngày kết thúc: LocalDateInterval hoặc nội dung tương tự. Tôi sẽ không sử dụng lại Interval vì điều này sẽ gây nhầm lẫn cho các khái niệm: một cặp giá trị LocalDatekhông đại diện cho hai phiên bản.

Cá nhân tôi không tìm thấy Interval đặc biệt hữu ích trong Thời gian Joda ... Tôi đã cân nhắc xóa nó khỏi Thời gian Noda. Bây giờ có vẻ như tôi không nên;)

+0

Nhưng những gì tôi cần không phải là khoảng thời gian, mà là một khoảng thời gian cụ thể. Ví dụ: từ 1/1/2011 đến 10/1/2012. Tôi sẽ chỉnh sửa câu hỏi để làm rõ –

+0

Doh, xin lỗi, tôi hiện đang ở với bạn. –

+0

Thời gian Noda là gì? Đó có phải là thư viện thời gian cá nhân của Jon Skeet không? –

4

Lưu ý rằng việc sử dụng DateMidnight sẽ không thành công trong chuyển đổi DST. Nó là tốt hơn để chuyển đổi bằng cách sử dụng date.toDateTimeAtStartOfDay().

+0

Bạn có thể đưa ra một ví dụ cụ thể về việc nó sẽ thất bại ở đâu không? –

2

Tôi cũng cần khoảng thời gian của các đối tượng LocalDate nhưng không được JodaTime hỗ trợ. Vì vậy, tôi phải tạo triển khai của riêng mình. Sau đó tôi đã quyết định đánh bóng nó một chút và tạo ra nguồn mở.

Bạn có thể xem nó: https://github.com/serddmitry/joda-interval (có sẵn trên Maven Central).

24

Tôi personnaly sử dụng lớp Range từ Ổi.

Nó hỗ trợ các phạm vi mở đã kết thúc. Cũng có thể chỉ định các giới hạn được bao gồm hoặc loại trừ. Trong số rất nhiều khả năng khác, chúng cho phép dễ dàng đại diện cho "trước một ngày" hoặc "sau một ngày".

Ví dụ về khoảng thời gian mở.

Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31")); 
Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01")); 

Nó cũng cung cấp các vị từ thử nghiệm dễ dàng, như chứa và chứaTất cả và hoạt động giao lộ. Tất cả điều này được kiểm tra và duy trì.

1
public class LocalDateInterval { 

    private LocalDate begin; 
    private LocalDate end; 

    public LocalDateInterval(LocalDate begin, LocalDate end) { 
    this.begin = begin; 
    this.end = end; 
    } 



} 

Điều này phù hợp với tôi.

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