2013-07-09 45 views
8

Tôi trả về một danh sách các ngày UTC/lần từ một dịch vụ Net, định dạng giống như vậy:moment.js, múi giờ và tiết kiệm ánh sáng ban ngày

"2013-07-09 19:48:07 +00:00". 

Trên client, tôi chuyển đổi mỗi một trong các giá trị chuỗi thành một thời điểm dựa trên UTC tương ứng, như vậy

var fooUtc = new moment.utc(serverDateTimeString) 

Trên trang, có một danh sách các vùng thời gian mà người dùng có thể thay đổi. Đây là những ràng buộc với một bộ sưu tập của các đối tượng múi giờ như sau:

{ 
    id: "Central Standard Time", 
    label: "(UTC-06:00) Central Time (US & Canada)", 
    observesDaylightSavings: true, 
    baseUtcOffset: { 
     asHours: -6, 
     asMinutes: -360, 
     asText: "-06:00" 
} 

sau đó tôi hiển thị mỗi khoảnh khắc trôi qua trong múi giờ chọn bù đắp, như vậy:

fooUtc.local().zone(selectedTimeZone.baseUtcOffset.asMinutes).format() 

Tuy nhiên, kết quả không tính đến tiết kiệm ánh sáng ban ngày, vì dữ liệu múi giờ đến từ .Net không phân biệt giữa chênh lệch giữa dst và non dst.

Có cách nào để thực hiện công việc này với moment.js hoặc bit thời gian-múi giờ mới không? Tôi nghĩ rằng nó có thể có thể nếu tôi có thể ánh xạ tên bù UTC tiêu chuẩn (ví dụ: "Giờ chuẩn trung tâm") thành mã định danh DB của một múi giờ nhất định (ví dụ: "America/Chicago"), nhưng nếu có cách dễ dàng hơn, vui lòng cho tôi biết.

+0

tôi đã kết thúc việc tạo ra một tập tin ánh xạ dựa trên [bài này] [1] [1]: http://stackoverflow.com/questions/8372537/converting-olson-tzid-to- windows-time-zone –

Trả lời

5

Bạn nên khám phá bằng cách sử dụng Noda Time ở bên .Net và moment-timezone trên máy khách, chuyển Id múi giờ IANA/Olson.

Nếu bạn muốn gắn vào các id múi giờ của Windows trong danh sách thả xuống, thì bạn có thể thực hiện chuyển đổi với dữ liệu CLDR được nhúng trong Thời gian Noda. Tôi đã làm tài liệu về cách thực hiện trong bài đăng này: How to translate between Windows and IANA time zones?

Nhưng giải pháp tốt hơn là tránh các vùng Windows cùng nhau. Bạn có thể điền danh sách các id IANA/Olson bằng cách sử dụng kỹ thuật tôi mô tả trong bài đăng này: How should I populate a list of IANA/Olson time zones from Noda Time?

Tốt hơn, bạn có thể thay thế danh sách thả xuống bằng điều khiển (nội tuyến hoặc phương thức) hiển thị bản đồ thế giới , vì vậy người dùng của bạn có thể dễ dàng chọn múi giờ của họ. Kiểm soát tốt nhất cho điều này mà tôi đã thấy là this one, nhưng cũng có một vài điều khác ngoài đó.

Nếu bạn có thể xử lý nghiêm chỉnh các vùng IANA/Olson, thì không cần phải chuyển đổi. Bạn có thể từ bỏ đối tượng Windows TimeZoneInfo và chỉ sử dụng Noda Time. Nếu bạn muốn, bạn chỉ có thể thay thế các hàm chuyển đổi múi giờ của mình và giữ nguyên phần còn lại. Hoặc, bạn có thể chuyển tất cả và thay thế tất cả các số DateTimeDateTimeOffset sử dụng với các loại Thời gian Noda. Tuỳ bạn.

+0

sẽ đẹp, nhưng các sở thích của người dùng được lưu trữ trong DB bằng cách sử dụng id múi giờ, vì vậy tôi bị kẹt với nó ngay bây giờ. Cảm ơn vì đã lên đầu Noda ... Tôi sẽ xem ... –