2015-09-15 18 views
10

Có cách nào trong JodaTime để xây dựng một Date/DateTime mà sẽ luôn nhỏ hơn/lớn hơn bất kỳ Date/DateTime nào khác không? Nội dung nào đó dọc theo dòngNgày/Thời gian tối thiểu/ngày giờ trong JodaTime

DateTime bigBang = DateTime.xxx(); 
DateTime endOfUniverse = DateTime.yyy(); 

Ràng buộc: Tôi không muốn sử dụng thư viện ngày Java chuẩn.

+1

Tôi nghĩ rằng 'DateTime mới (0)' sẽ cung cấp cho bạn 'DateTime' tối thiểu có thể được biểu diễn. Chỉ là một dự đoán hoang dã, nhưng có lẽ giá trị tối đa của 'long' sẽ là tối đa? –

+2

Với Java 8, nó chỉ đơn giản là ['LocalDateTime.MAX'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#MAX) (resp. MIN) – Tunaki

+0

@TheodorosChatzigiannakis 0 sẽ cung cấp cho 01/01/1970. Bạn chắc chắn có thể đi xa hơn trong quá khứ với các giá trị tiêu cực. Tuy nhiên, MIN_VALUE và MAX_VALUE không phải là giá trị hợp lệ cho DateTime. Chúng ổn cho Instant. –

Trả lời

8

java.time

Dự án Joda-Time hiện đang ở chế độ bảo trì. Nhóm này khuyên bạn nên di trú sang các lớp java.time.

Đối với phút/tối đa trong java.time, hãy xem my Answer trên một Câu hỏi tương tự.

Joda thời gian

Joda-Time bài hát thời gian như một số của milliseconds kể từ khi kỷ nguyên của giây phút đầu tiên của năm 1970 tại UTC. Số này được giữ bằng cách sử dụng số nguyên 64-bitlong. Vì vậy, về mặt kỹ thuật, tối đa và tối thiểu là +/- giới hạn của một long.

… new DateTime(Long.MIN_VALUE) 
… new DateTime(Long.MAX_VALUE) 

Thời gian Joda không có giá trị tối thiểu/tối đa nào thuận tiện như hằng số. Ngược lại, lưu ý rằng người kế thừa Joda-Time, java.time được tích hợp vào Java 8 trở lên, thực sự cung cấp các hằng số LocalDateTime.MINLocalDateTime.MAX.

Nhân tiện, nhóm Joda-Time đã khuyên chúng tôi nên chuyển sang java.time. Phần lớn chức năng java.time được chuyển sang Java 6 & 7 trong số ThreeTen-Backport, được điều chỉnh thêm cho Android theo số ThreeTen-ABP.

Quá lớn, quá nhỏ

Cẩn thận với những thái cực. Việc sử dụng chúng không thực tế. Nhiều thư viện, ứng dụng, cơ sở dữ liệu và các bồn rửa/nguồn khác của các giá trị ngày giờ có thể có nhiều giới hạn khác nhau, một số lớn hơn nhiều nhưng thường nhỏ hơn nhiều.

Ví dụ: nhiều hệ thống sử dụng truyền thống cũ từ UNIX & POSIX của thời gian theo dõi dưới dạng số nguyên 32 bit của toàn bộ giây kể từ 1970-01-01T00: 00: 00Z. Giới hạn tự nhiên của +/- hai tỷ giây dẫn đến kết quả hiện ra lờ mờ Year 2038 Problem.

Giới hạn khác là kích thước hiển thị vật lý của các trường trên biểu mẫu và báo cáo chỉ mong đợi bốn chữ số trong một số năm.

Cách giải quyết

Bạn có thể xác định min/max của riêng mình.

Bạn có thể muốn các giá trị cực đoan như năm 0000 và năm 9999. Thời gian Joda hỗ trợ năm sau 9,999 nhưng tôi sẽ gắn 4 chữ số để vừa với các định dạng thường được sử dụng để hiển thị trên màn hình và trong báo cáo. Trực quan, bốn nines nổi bật như một ngày không có thật.

Hoặc bạn có thể muốn có giá trị tối thiểu dự kiến ​​phù hợp với logic nghiệp vụ của mình. Nếu xây dựng một hệ thống lập hóa đơn mới, thì bạn biết năm này sẽ luôn là năm nay hoặc muộn hơn.

Tôi đề xuất xác định các hằng số trên lớp trợ giúp. Một cái gì đó như thế này:

package com.example; 

import org.joda.time.DateTime; 
import org.joda.time.DateTimeZone; 

public class JodaTimeHelper { 

    static final public DateTime START_OF_TIME = new DateTime(0000, 1, 1, 0, 0, 0, DateTimeZone.UTC); 
    static final public DateTime END_OF_TIME = new DateTime(9999, 1, 1, 0, 0, 0, DateTimeZone.UTC); 

    static final public DateTime MINIMUM_INVOICE_DATETIME = new DateTime(2015, 1, 1, 0, 0, 0, DateTimeZone.UTC); 

} 

Đây là cú pháp để gọi những hằng số đó.

System.out.println("START_OF_TIME: " + JodaTimeHelper.START_OF_TIME); 
System.out.println("END_OF_TIME: " + JodaTimeHelper.END_OF_TIME); 
System.out.println("END_OF_TIME: " + JodaTimeHelper. MINIMUM_INVOICE_DATETIME); 

Khi chạy.

START_OF_TIME: 0000-01-01T00:00:00.000Z 
END_OF_TIME: 9999-01-01T00:00:00.000Z 
MINIMUM_INVOICE_DATETIME: 2015-01-01T00:00:00.000Z 
+1

Chỉ cần một lưu ý phụ, các ngày cực đại/tối đa được hỗ trợ bởi JodaTime sẽ là: Ngày giờ mới (Long.MIN_VALUE); Ngày giờ mới (Long.MAX_VALUE); –

2

Khi tất cả các ngày nằm trong cùng một múi giờ, bạn có thể tạo đối tượng DateTime với các trường được gán cho giá trị tối thiểu hoặc tối đa.
Tuy nhiên khi sử dụng constructor

DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute) 

này với Years.MAX_VALUE.getYears() tôi có dưới đây ngoại lệ:

enter image description here

Vì vậy, sử dụng số tối đa của năm từ ngoại lệ, tôi đã nảy ra sau end-of -universe dateTime:

DateTime dtMax = new DateTime(292278993, 12, 31, 23, 59, 59); 
System.out.println(dtMax); 
// prints 292278993-12-31T23:59:59 

Xem documentation để biết thêm etails.
Một cuộc thảo luận thú vị có thể được đọc here.

+0

Điều này phụ thuộc vào Thời gian sử dụng. Trong CopticChronology, các năm tối đa là 292272708 – Tunaki

+0

ISOChronology được sử dụng trong ví dụ trên. – MaxZoom

0

Sau khi đọc qua nhiều tiếp tuyến khác nhau về điều này, cuối cùng tôi quyết định tìm ra trường hợp tối thiểu hoạt động cả tối thiểu và tối đa cho múi giờ UTC. Và nó chỉ ra rằng cố gắng sử dụng Long 's MIN_VALUEMAX_VALUE gửi cho tôi xuống con đường mòn thỏ.

Vì vậy, với đoạn mã sau:

new DateTime(milliseconds, DateTimeZone.UTC) 

đây là mức thấp nhất/giá trị tối đa mà làm việc cho milliseconds (thử nghiệm trong Java 1.7):

UTC_DATE_TIME_MIN_VALUE_IN_MILLIS = 9223372017129599999L 
UTC_DATE_TIME_MAX_VALUE_IN_MILLIS = -9223372017043200000L 

Cả hai giá trị xấp xỉ 20 tỷ từ Long.MIN_VALUELong.MAX_Value.

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