Tôi muốn sử dụng giá trị thời gian MIN/MAX có thể chuyển đổi giữa ZonedDateTime
và Instant.toEpochMilli()
, để được sử dụng làm giá trị sentinel cho bộ lọc/truy vấn.Giá trị MIN/MAX nào sẽ hoạt động với cả ZonedDateTime và Instant.toEpochMilli?
tôi đã cố gắng:
OffsetDateTime.MIN.toInstant().toEpochMilli();
OffsetDateTime.MAX.toInstant().toEpochMilli();
nhưng tôi nhận được ngoại lệ này:
java.lang.ArithmeticException: long overflow
at java.lang.Math.multiplyExact(Math.java:892)
at java.time.Instant.toEpochMilli(Instant.java:1237)
Và sau đó tôi đã cố gắng này:
ZonedDateTime.ofInstant(Instant.MIN, ZoneId.systemDefault());
ZonedDateTime.ofInstant(Instant.MAX, ZoneId.systemDefault());
nhưng sau đó tôi nhận được ngoại lệ này:
java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): -1000000001
at java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330)
at java.time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722)
at java.time.LocalDate.ofEpochDay(LocalDate.java:341)
at java.time.LocalDateTime.ofEpochSecond(LocalDateTime.java:422)
at java.time.ZonedDateTime.create(ZonedDateTime.java:456)
at java.time.ZonedDateTime.ofInstant(ZonedDateTime.java:409)
Tôi cũng đã cố gắng 'Z' ZoneId
:
ZonedDateTime.ofInstant(Instant.MIN, ZoneId.of("Z"))
nhưng đó trả về ngoại lệ tương tự như người cuối cùng.
Cuối cùng tôi đã cố gắng điều sau đây, và có vẻ như để làm việc:
ZonedDateTime.ofInstant(Instant.EPOCH, ZoneId.of("Z"));
ZonedDateTime.ofInstant(Instant.EPOCH.plusMillis(Long.MAX_VALUE), ZoneId.of("Z"));
Đó có phải là giải pháp tốt nhất?
cũng đáng chú ý về phạm vi ngày của bạn. Tất cả các trường hợp được coi là điều này có thể có nghĩa là trước năm 1970 hoặc sau khi tràn của epoch (tôi đã có một trường hợp với phạm vi ngày 100+ năm, bạn không thể sử dụng một kỷ nguyên ms cho điều đó) – Rogue
Thanks @Hugo. Đơn giản và rực rỡ. Bây giờ hoàn toàn có ý nghĩa để sử dụng Long.MIN_VALUE/MAX_VALUE. – jacob
Bạn được chào đón, vui lòng giúp đỡ! Thật vậy, việc sử dụng các giá trị Long min và max mang lại cho bạn một phạm vi tốt (hơn 200 triệu năm, đủ cho hầu hết các trường hợp, tôi giả sử). –