2010-03-10 38 views
5

Múi giờ của tôi là CET (Berlin).
Và trong khi DateTime thử nghiệm Joda của tôi nhận thấy một số những điều kỳ lạ:Kết quả lẻ trong Thời gian Joda cho 01.04.1893

new DateTime(1893, 4, 1, 0, 0, 0, 0); 
=> java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate(); 
=> Fri Mar 31 00:06:32 CET 1893 

Một 6 phút 32 giây chuyển theo múi giờ kết quả trong một thời gian không tồn tại ??
Tôi phải nói điều này là rất bất ngờ vì tôi không chỉ định bất kỳ thông tin múi giờ nào và do đó không mong đợi chạy vào loại sự cố này.
Nếu vào tháng 3 năm 1893 CET (Berlin) không tồn tại - tại sao không chọn new DateTime(1893, 3, 31, 0, 0, 0, 0) chọn múi giờ phù hợp với thời gian tôi đã chỉ định (tức là 0 phút và 0 giây)?

Tùy chọn của tôi để có được thời gian chính xác với DateTime là gì?

- EDIT -
Sự cố dường như là toDate(). Tôi đã chỉnh sửa nó trước khi đăng câu hỏi.
Joda bản thân thực sự hoạt động tốt:

new DateTime(1893, 3, 31, 0, 0, 0, 0); 
=> 1893-01-01T00:00:00.000+00:53:28 

Nó chỉ là chuyển đổi sang ngày di chuyển một phần của bù đắp vào phút và giây.

Trả lời

10

Nếu bạn không chỉ định múi giờ, rất tiếc Joda Time sử dụng hệ thống một. Và vâng, Berlin really did change vào thời điểm đó (và sau 6 phút và 32 giây). Vì vậy, bạn đã xác định thời gian địa phương không tồn tại.

Ý của bạn là gì về "tại sao [...] không chọn múi giờ khớp với thời gian tôi đã chỉ định?" - múi giờ ảnh hưởng đến cách giờ địa phương được ánh xạ tới UTC. Trong múi giờ, bạn ẩn hoàn toàn được chỉ định (bằng cách để nó chọn mặc định hệ thống của bạn) mà thời gian đó không tồn tại; không có bản đồ tức thì UTC nào cho giờ địa phương đó. Có bất kỳ số múi giờ nào mà sẽ bản đồ giờ địa phương - làm thế nào để Joda biết cái nào cần chọn?

Tôi đồng ý rằng việc sử dụng múi giờ mặc định của hệ thống là một động thái xấu trên phần của Joda (và chúng tôi đã sửa trong Noda Time) nhưng tất cả các hành vi còn lại là hoàn toàn ổn. (Thời gian Noda có một ngoại lệ cụ thể cho tình huống chính xác này để phân biệt nó với các giá trị rõ ràng là xấu, nhưng chúng ta đi.)

Nếu bạn không muốn múi giờ nhập vào nó tại tất cả thì bạn nên sử dụng một số LocalDateTime.

+5

IOW: Đó không phải là lỗi, đó là một tính năng. Theo nghĩa đen. –

+0

Cảm ơn các liên kết. Tôi thấy rằng CET không tồn tại trước ngày đó. Và tôi thấy rằng joda thực sự tạo ngày tháng chính xác. Vấn đề của tôi dường như là với việc chuyển đổi sang java.util.Date mà không xử lý sự thay đổi tốt (xem chỉnh sửa của tôi). Nhưng đó có thể là một vấn đề với Date hơn DateTime. – Stroboskop

0

Bạn đã thử chỉnh sửa mục bằng new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC);?

+0

Tôi vẫn muốn giữ thông tin múi giờ của mình. – Stroboskop

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