Theo như tôi có thể nói có hai lỗi liên quan ở đây. Cả hai đều là (nếu tôi đúng) trong lớp java.util.Date
, lớp cha của java.sql.Timestamp
.
Đầu tiên, không có thời gian chuyển đổi bù đắp ở Warsaw vào năm 1900. Việc chuyển đổi sớm nhất mà Java 8 của tôi biết là vào năm 1915. Vì vậy, Warsaw đã được bù đắp 1:24 từ GMT trong suốt thời gian chúng tôi quan tâm với.
tôi đã cố gắng:
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Warsaw"));
ZoneOffset offset0124 = ZoneOffset.ofHoursMinutes(1, 24);
System.out.println("" + new Date(0, 0, 1, 0, 59)
+ " -> " + new Date(0, 0, 1, 0, 59).toInstant().atOffset(offset0124));
System.out.println("" + new Date(0, 0, 1, 1, 14)
+ " -> " + new Date(0, 0, 1, 1, 14).toInstant().atOffset(offset0124));
System.out.println("" + new Date(0, 0, 1, 1, 24)
+ " -> " + new Date(0, 0, 1, 1, 24).toInstant().atOffset(offset0124));
này in:
Mon Jan 01 00:59:00 CET 1900 -> 1900-01-01T01:23+01:24
Mon Jan 01 01:38:00 CET 1900 -> 1900-01-01T01:38+01:24
Mon Jan 01 01:24:00 CET 1900 -> 1900-01-01T01:24+01:24
Phương pháp này Timestamp.valueOf
phương pháp mà bạn sử dụng gián tiếp sử dụng một phản Date
constructor, vì vậy rất là I (không giống constructor chính xác, tôi đang sử dụng cái không có giây, tin tưởng nó không tạo ra sự khác biệt nào). Tôi sẽ bình luận về ba trường hợp trên ngược:
- 1:24 được xử lý một cách chính xác, chúng tôi nhận được thời gian dự kiến từ cả
Date.toString()
và từ OffsetDateTime
.
- 1:14 được xem là 1:38, 24 phút sau đó. Điều này trông giống như một lỗi đối với tôi.
- 0:59 được xem là 1:23, cũng sau 24 phút. Chúng ta có thể thấy điều này từ
OffsetDateTime
. Cùng một lỗi. Tuy nhiên, Date.toString()
sản xuất 00:59 như mong đợi. Điều này dường như tôi là một lỗi thứ hai mà bằng cách nào đó bù đắp cho cái đầu tiên. Tôi chưa kiểm tra, nhưng tôi nghi ngờ rằng nguồn gốc của lỗi này cũng gây ra Timestamp.toString()
để hoạt động không chính xác.
Là séc, tôi đã tính chênh lệch giữa các đối tượng Timestamp
của bạn là 0:59 và 1:24. Kết quả mong muốn là 25 phút hoặc 1 500 000 mili giây.Mã này là:
System.out.println(java.sql.Timestamp.valueOf("1900-01-01 01:24:00").getTime()
- java.sql.Timestamp.valueOf("1900-01-01 00:59:00").getTime());
này in
60000
60 giây, giống như 1 phút. Vì vậy, mặc dù cả hai dấu thời gian được in theo cách chúng tôi đã mong đợi, vẫn có một lỗi liên quan.
Ngôn ngữ của bạn là gì? Đi qua Java 8 chỉ, không có Scala, tôi không thể tái tạo điều này bằng ngôn ngữ của tôi (en_US). – rgettman
@rgettman 'ZoneId.systemDefault' trả lại' Châu Âu/Warsaw ' –
Tôi đã sao chép vấn đề với 'System.setProperty (" user.timezone "," Europe/Warsaw ");' ... trông giống như một lỗi đối với tôi và đã có lỗi múi giờ trong quá khứ. Bước qua mã thư viện có vẻ như có một sự chuyển đổi không có thật trong cơ sở dữ liệu zoneinfo trong khoảng thời gian đó. Nó sẽ mất một số công việc để xác minh điều này, và tôi không có thời gian ngay bây giờ, thật không may. –