2009-01-25 86 views
6

Chúng tôi đang làm việc với lượng lớn dữ liệu, tất cả được gắn thẻ trong UTC (bằng Java). Giữa việc đọc dữ liệu này, lưu trữ nó trong một cơ sở dữ liệu và lấy nó ra một lần nữa, nó đã xảy ra, rằng một số dữ liệu đã được tắt một giờ trong thời gian tiết kiệm ánh sáng ban ngày. Vì UTC không có khái niệm về thời gian tiết kiệm ánh sáng ban ngày, đây rõ ràng là một lỗi trong phần mềm. Một khi đã biết, thật dễ dàng để sửa chữa.Kiểm tra xử lý múi giờ chính xác

Tuy nhiên, thật tuyệt khi có một số thử nghiệm đơn vị/tích hợp hoạt động bất kể chênh lệch thời gian hiện tại - ví dụ: Tôi muốn thay đổi múi giờ địa phương và chạy một số phương thức lặp đi lặp lại trong các múi giờ khác nhau này để đảm bảo UTC được xử lý chính xác.

Khi thử nghiệm sẽ chạy tự động và - tốt nhất là - trong một Testsuite, tôi tự hỏi làm thế nào để kiểm tra tốt nhất cho hành vi chính xác. Sẽ dễ dàng thay đổi các thiết lập cục bộ như múi giờ khi khởi động lại JVM, nhưng việc chạy nó trong một bộ kiểm thử không phải là dễ dàng.

Có ai biết môi trường, thư viện hoặc mẫu thử hỗ trợ kịch bản này không? Chúng tôi thường làm việc với JUnit, nhưng mở cửa để thêm môi trường/kỹ thuật khác nếu nó giúp loại bỏ các vấn đề như thế này. Tôi cho rằng đó là một bài kiểm tra tích hợp hơn đơn vị.

Chỉnh sửa: Đã có hai câu trả lời rất hữu ích, nhưng tôi đoán phải có nhiều kỹ thuật hơn ở đó. Có ai có thông tin có thẩm quyền về thời gian/tần suất TimeZone.getDefault sẽ được gọi (xem các bình luận cho câu trả lời của Jon Skeets) không?

Lưu ý: Mặc dù câu hỏi này có câu trả lời được chấp nhận, tôi không hoàn toàn chắc chắn, câu trả lời để chấp nhận. Ngay cả với sự chấp nhận này, tôi cũng muốn thấy nhiều ý tưởng và kỹ thuật hơn.

Cảm ơn bạn đã nhập!

+1

Để biết thêm ý tưởng và kỹ thuật, bạn có thể kiểm tra bài đăng cá nhân về cảnh báo múi giờ Java tại: http://tshikatshikaaa.blogspot.nl/2012/09/about-java-timezone-and-calendar-caveats.html. Để có thời gian hiện tại trên toàn thế giới theo múi giờ, hãy kiểm tra: http://yourworldclocks.juplo.com/ Hy vọng điều này sẽ hữu ích! – JVerstry

Trả lời

6

Tôi khuyên bạn nên xem JodaTime cung cấp một số đường để giúp quản lý các vấn đề về Ngày/Giờ/TimeZone rõ ràng hơn trong mã của bạn.

Chúng tôi sử dụng chúng trong suốt quá trình thử nghiệm và sản xuất kể từ khi nó làm tăng Java API gốc cho các vấn đề Ngày/Giờ là vô song. Việc sử dụng các thử nghiệm này hoạt động tốt trong JUnit

+0

Cảm ơn, chúng tôi chắc chắn sẽ có một cái nhìn –

7

Java cho phép bạn đặt múi giờ mặc định (java.util.TimeZone.setDefault). Tôi đã viết các bài kiểm tra trước để đặt múi giờ thành nhiều tùy chọn khác nhau và kiểm tra xem mọi thứ vẫn hoạt động. Hãy cẩn thận mặc dù - nếu bạn đang song song với hầu hết các bài kiểm tra đơn vị của mình, bạn sẽ cần phải thực hiện các bước này theo trình tự.

Tôi khuyên bạn nên kiểm tra trong một số múi giờ có thời gian tiết kiệm ánh sáng ban ngày được áp dụng và một số không có. Sử dụng múi giờ của Úc cũng tốt, vì DST áp dụng vào thời gian ngược lại của năm đến bán cầu bắc.

+1

Cảm ơn. Tôi không biết nếu tôi có thể tin tưởng thay đổi giá trị mặc định hơn và hơn nữa hoặc khi múi giờ mặc định được đọc trong vòng đời của máy ảo. Bạn có nói tôi có thể không? Tài liệu tôi đã tìm thấy cho múi giờ không chứa quá nhiều thông tin. Javadoc chứa hầu như không có thông tin trong này liên quan ... –

+0

Nó phụ thuộc vào những gì đang nắm lấy múi giờ mặc định. Một số điều có thể cache nhưng tôi nghi ngờ nhất sẽ gọi getDefault mỗi lần. –

+0

Cảm ơn - Tôi luôn nghi ngờ điều tồi tệ nhất, đặc biệt là khi tôi đang cố gắng dựa vào kết quả của các bài kiểm tra tự động. Có lẽ tôi nên lạc quan hơn trong trường hợp này ... –

1

Ý kiến ​​về kết nối với máy chủ thời gian và nhận cập nhật là gì?

+0

Bạn có nghĩa là thử nghiệm kết nối với máy chủ thời gian hoặc sử dụng các kết nối này? Kiểm tra kết nối máy chủ thời gian sẽ là một câu hỏi khác, sử dụng chúng không giúp kiểm tra ứng dụng xử lý chính xác múi giờ - nó chỉ giúp nhận được thời gian hiện tại chính xác. –

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