2012-07-03 18 views
12

C# có tính đến thời gian tiết kiệm ánh sáng ban ngày khi chuyển đổi giữa các múi giờ không?TimeZoneInfo có tính đến DST không?

Tôi có ngày nguồn hiện tại ở Luân Đôn và tôi muốn chuyển đổi múi giờ thành múi giờ của tôi (CET). Đây là mã tôi đang sử dụng.

DateTime time = DateTime.ParseExact(timeString, "HH:mm", null); 
time = DateTime.SpecifyKind(time, DateTimeKind.Unspecified); 

//Convert it to the right timezone. It is currently in GMT 

TimeZoneInfo gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
TimeZoneInfo current = TimeZoneInfo.Local; 

DateTime utc = TimeZoneInfo.ConvertTimeToUtc(time, gmt); 
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, core.startTime = local; 

Nó hiện đang hoạt động tốt. Tuy nhiên khi DST xé đầu xấu xí của nó, nó sẽ tiếp tục làm việc hay nó sẽ phá vỡ khủng khiếp? Tôi hơi cảnh giác với TimeZones do có rất nhiều vấn đề trong quá khứ.

+1

Bạn nhận ra rằng Luân Đôn không có trên GMT, phải không? Vì bây giờ là mùa hè ở Bắc bán cầu, Luân Đôn đang ở trên UTC + 1 khi bạn đang ở trên UTC + 2. – Gabe

+0

Xem vấn đề của tôi là gì? Tôi không muốn đánh dấu nó là BST (đó là thời gian hiện tại) bởi vì khi nó dừng lại BST nó quay trở lại GMT. Tôi hy vọng nó tự động. Tôi HATE múi giờ. – Aabela

+0

May mắn thay cho bạn, nó sẽ tự động sử dụng BST cho thời gian trong mùa hè và GMT cho thời gian trong mùa đông. Bạn đúng là 'TimeZone' có vấn đề, nhưng đó là những gì' TimeZoneInfo' đã được tạo ra. – Gabe

Trả lời

1

TimeZoneInfo.GetAdjustmentRules sẽ cung cấp cho bạn bộ sưu tập các quy tắc về các thay đổi trong bù DST và khi chúng đi vào và hết hiệu lực.

Tuy nhiên, người dùng của bạn vẫn có thể kết thúc bằng cách bỏ chọn "Tự động điều chỉnh để tiết kiệm ánh sáng ban ngày" trong Bảng điều khiển Windows Ngày và giờ. Nếu DST bị tắt trong Windows thì bạn sẽ nhận được một bộ sưu tập các quy tắc điều chỉnh trống.

Nếu bạn muốn áp dụng quy tắc điều chỉnh tự động, bạn phải sử dụng đối tượng DateTime mà DateTimeKind đã được đặt. Nếu DST bị tắt, điều này sẽ được vinh danh trong quá trình chuyển đổi.

GMT là giờ mặt trời tại Đài quan sát Hoàng gia ở Greenwich. Người Anh đã phát minh ra toàn bộ hoạt động kinh doanh của thời gian bù giờ từ một dòng ngày bởi vì họ là người đầu tiên phối hợp bất cứ điều gì trên quy mô toàn cầu. Trong những ngày mưa đá, họ đã có một hải quân trên toàn hành tinh của thuyền buồm và không có đài phát thanh. Độ trễ trên đơn đặt hàng là hàng tuần hoặc hàng tháng, do đó, thống nhất, chính xác, thời gian toàn cầu được phát minh bởi những người duy nhất có khung tham chiếu lớn hơn một hành tinh - các nhà thiên văn học Hoàng gia.

Lực thủy triều của mặt trăng đang làm chậm vòng quay của Trái Đất. Phải mất rất nhiều nước để slosh một đại dương của nước lên xuống và nó không phải là ma thuật, nó đến từ thời điểm spin của hành tinh.

Ngoài ra thời lượng của quỹ đạo mặt trời cũng không đổi, vì vậy chúng tôi có giây nhảy vọt mỗi giờ và sau đó đồng bộ hóa lịch với thực tế hành tinh. Mặt khác, thời gian bên ngoài không có sự ngu xuẩn như vậy, vì vậy chúng ta trôi dạt khỏi nó. Sau đó, có trôi dạt tương đối. Vệ tinh GPS di chuyển quá nhanh đến nỗi chúng thực sự phải bù đắp cho thời gian cong vênh nhẹ.

+0

Tôi có hiểu chính xác là "Không, bạn sẽ phải viết mã để tự kiểm tra"? Hay là tự động? – Aabela

+0

Không, bạn sẽ phải viết mã để tự mình kiểm tra nó –

+0

Tuy nhiên nhiều lực thủy triều đang làm chậm hành tinh, điều này không trả lời chính xác câu hỏi: "Liệu TimeZoneInfo có tính đến DST không?" mà câu trả lời thực sự là: "Có và bạn không cần phải viết bất kỳ mã nào cho chính mình, ít nhất là tại .net 4.5". – pasx

0

C# có tính đến thời gian tiết kiệm ánh sáng ban ngày khi chuyển đổi giữa các múi giờ không?

Có, giả sử máy tính của bạn được cập nhật vì thông tin múi giờ đôi khi được cập nhật với cập nhật cửa sổ. Nó sẽ vẫn hoạt động ngay cả khi không có cửa sổ cập nhật nếu quốc gia đó không thay đổi thời gian DST của họ (điều này đã xảy ra ở Úc gần đây)

Tôi có một ngày nguồn hiện tại ở London và tôi muốn chuyển đổi nó sang múi giờ của tôi (CET)

Ý của bạn là 'ngày nguồn hiện tại ở Luân Đôn'? Luôn lưu trữ ngày của bạn dưới dạng UTC và chuyển đổi chúng 'vào phút cuối' thành giờ địa phương mong muốn.

Nếu bạn đang tự hỏi điều gì xảy ra khi tiết kiệm ánh sáng ban ngày thay đổi thì bạn có thể kiểm tra điều này bằng cách thay đổi đồng hồ trên máy tính của bạn.

+1

Điều đó có nghĩa là tôi đang lấy ngày từ một nhà cung cấp cho tôi thời gian ở Luân Đôn và tôi cần bình thường hóa nó với một ngày khác từ một nhà cung cấp đưa nó cho tôi múi giờ địa phương của tôi. Tôi cố gắng tránh những vấn đề này nhưng đôi khi không có gì để làm. Tôi không muốn thay đổi đồng hồ để tìm hiểu vì lần cuối tôi làm nhiều thứ sai với tham chiếu dự án vì một số lý do (một số việc cần làm với thời gian xây dựng). – Aabela

+0

@Aabela không phải là lý do đủ tốt để không thay đổi đồng hồ trên máy tính của bạn. bạn là chủ nhân của máy tính của bạn. thay đổi đồng hồ, kiểm tra, sau đó thay đổi lại. bạn có thể làm sạch giải pháp của bạn (trong menu Xây dựng) mà nên sửa chữa điều đó. Nếu bạn vẫn lo lắng kiểm tra nó trên một máy ảo – wal

+0

bạn nên chuyển đổi cả hai lần đó thành UTC và làm việc với chúng trong UTC. – wal

0

Ít nhất bằng .net 4.5 TimeZoneInfo không xử lý thời gian tiết kiệm ánh sáng ban ngày.

Cách dễ nhất để kiểm tra xem nó là so sánh BaseUtcOffset và GetUtcOffset

var baseOffset = timeZoneInfo.BaseUtcOffset; 
    var currentOffset = timeZoneInfo.GetUtcOffset(currentLocalTime); 
    var isDst = currentOffset > baseOffset; 
    var delta = currentOffset - baseOffset; 

này là dễ dàng hơn nhiều so với đối phó với AdjustmentRule mà bạn không cần nếu bạn chỉ quan tâm đến việc điều chỉnh một DateTime cho DST.

Btw GMT đã lỗi thời và được thay thế bằng UTC.

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