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.MIN
và LocalDateTime.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
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? –
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
@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. –