Tôi biết rằng DateTimeOffset lưu trữ ngày/giờ UTC và một khoảng bù. Tôi cũng biết từ this MSDN blog entry rằng DateTimeOffset nên được sử dụng để "Làm việc với thời gian tiết kiệm ánh sáng ban ngày".DateTimeOffset xử lý thời gian tiết kiệm ánh sáng ban ngày như thế nào?
Điều tôi đang cố gắng hiểu chính xác cách DateTimeOffset "hoạt động (s) với thời gian tiết kiệm ánh sáng ban ngày". Sự hiểu biết của tôi, ít nhất là có, là thời gian tiết kiệm ánh sáng ban ngày là một quyết định chính trị và không thể suy ra từ hoàn toàn là một sự bù đắp. Làm thế nào nó có thể được rằng cấu trúc này là DST thân thiện nếu nó chỉ lưu trữ một bù đắp?
Tôi thu thập có thể có một cách để sử dụng lớp TimeZoneInfo kết hợp với DateTimeOffset. Tôi sẽ làm như thế nào?
Cuối cùng, có cách nào tốt hơn để tôi có thể đạt được những điều sau đây không?
(Tôi đã xem một số bài đăng từ Jon Skeet về Noda-Time nhưng tôi thu thập nó chưa sẵn sàng sản xuất và tôi không biết liệu nó có tích hợp tốt vào giải pháp hiện có của chúng tôi không).
Đây là kịch bản của chúng tôi. Máy chủ này là vì những lý do không mong muốn kế thừa chạy trên thời gian ở Vương quốc Anh. Chúng tôi có khách hàng bắt đầu đến từ Úc, có nhiều múi giờ. Các quốc gia khác có thể phát trực tuyến bất kỳ lúc nào.
Chúng tôi có bộ lập lịch dựa trên Hardcodet scheduler (sử dụng DateTimeOffset). Nó hoạt động rất tốt. Tuy nhiên, trong cơ sở dữ liệu của chúng tôi, chúng tôi chỉ lưu trữ đủ dữ liệu để xây dựng đối tượng DateTime (xem bên dưới) và trong mã phân lớp và hệ thống ống nước của chúng tôi, chúng tôi chỉ sử dụng DateTime, như ban đầu chúng tôi chỉ hỗ trợ người dùng ở Vương quốc Anh.
Trình lên lịch này chịu trách nhiệm cố định và huy động thiết bị nhà máy. Do đó, điều quan trọng là các sự kiện được lên lịch chạy ở thời gian địa phương do DST điều chỉnh của người dùng.
Người dùng nhập lịch biểu trên trang web của chúng tôi; hiện tại điều này được lưu trữ trong cơ sở dữ liệu như một ngày trong tuần, giờ và phút. Khi dữ liệu được đọc, chúng ta tạo đối tượng DateTime cho lần xuất hiện tiếp theo của ngày, giờ và phút đó. Tôi tự do thay đổi cấu trúc db để lưu trữ thêm một khoảng thời gian bù đắp hoặc múi giờ.
Khi ngày và giờ đến, trình lập lịch gửi lệnh (và thử lại một lúc). Sau đó nó chạy lại vào cùng một ngày và thời gian vào tuần tới (mặc dù dịch vụ này thực sự sẽ được tái chế bởi sau đó và mã sẽ chạy lại). Tất cả những gì tôi cần đạt được là kích hoạt các sự kiện đã lên lịch theo thời gian và ngày giờ địa phương được điều chỉnh theo múi giờ cho người dùng đó bằng cách sử dụng bộ lập lịch biểu phân lớp từ Hardcodet. Nếu DateTimeOffset thực sự là DST, nó có thể là tất cả những gì tôi cần làm là lưu trữ một offset và thay đổi mã hệ thống ống nước của chúng tôi để sử dụng cấu trúc này nhưng tôi nhận được ấn tượng không đơn giản như vậy. (Chúng tôi có thể có được múi giờ hiện tại từ vị trí GPS của nhà máy, nhưng đó là một cuộc thảo luận cho một ngày khác :)).
Điều gì sẽ xảy ra nếu ngày và giờ "tiếp theo" rơi vào khoảng trống trong quá trình chuyển đổi DST? I E. thời gian đó không bao giờ xảy ra vào ngày đó, kể từ khi thời gian nhảy lên trước một giờ. Tôi không nghĩ rằng có một giải pháp ma thuật mà chỉ có thể được cắm vào. –
@Damien_The_Unbeliever làm cho một điểm tốt, và ngược lại nên được xem xét quá - một thời gian địa phương có thể xảy ra hai lần trong cùng một ngày. Thời gian Noda buộc bạn phải xem xét các tùy chọn này khi bạn chuyển đổi từ LocalDateTime thành ZonedDateTime; .NET không :( –
+1 Điểm thú vị Damien –