Tôi đã có một tình huống mà thời gian chạy Java trả về các giá trị mili giây "đảo ngược" khi đọc ngày tháng từ cơ sở dữ liệu (trong java.sql.Date
). Giá trị mili giây xấp xỉ cùng một số ngày, nhưng được tính ngược từ năm 0.java.sql.Date hoạt động như thế nào với ngày tháng âm?
Sự cố đã được giải quyết bằng cách khởi động lại thời gian chạy Java.
Nhưng: Tôi phát hiện ra rằng Java xử lý các giá trị "đảo ngược" này gần như chính xác trừ ngày trong tuần.
Khi bạn chạy đoạn mã sau:
System.out.println(new java.util.Date(253402214400000l));
System.out.println(new java.util.Date(-377648784000000l));
Bạn sẽ nhận được kết quả như sau:
Fri Dec 31 01:00:00 CET 9999
Tue Dec 31 01:00:00 CET 9999
Một ví dụ khác:
System.out.println(new java.util.Date(-294192000000l));
System.out.println(new java.util.Date(-123967324800000l));
Kết quả:
Mon Sep 05 01:00:00 CET 1960
Mon Sep 05 01:00:00 CET 1960
Khi sử dụng trình chuyển đổi trực tuyến, kết quả sẽ khác với dòng thứ hai cụ thể. Nó sẽ dẫn đến một ngày âm (năm âm) gần ngày thực, tích cực:
Example1:
253402214400000 = Fri Dec 31 9999 01:00:00
-377648784000000 = Tue Oct 15 -9998 02:00:00
Example 2:
-294192000000 = Mon Sep 05 1960 02:00:00
-123967324800000 = Mon Aug 19 -1959 02:00:00
Tôi chưa tìm thấy bất kỳ thông tin nào về "chủ đề" này.
Vì vậy, bí ẩn đằng sau những ngày "đảo ngược" là gì? Tại sao Java xử lý chúng gần như chính xác? Và ý nghĩa của một JDBC ResultSet
trả lại giá trị "mili giây" ngược lại khi gọi resultSet.getDate(1).getTime()
là gì?
Bạn đang nói về 'java.util.Date' hoặc' java.sql.Date'? Nhận ra rằng hành vi của một tập kết quả JDBC là trình điều khiển cụ thể, vì mỗi trình điều khiển thực hiện nó cho cơ sở dữ liệu cụ thể của chúng. –
Đó là một java.sql.Date (lớp con của java.util.Date) – praisezh
Tôi không biết ý bạn là gì bởi "đảo ngược". – chrylis