2013-03-17 31 views
7

Trong năm 2013, Vương quốc Anh sẽ không bắt đầu thời gian tiết kiệm ánh sáng ban ngày cho đến ngày 31 tháng 3.Tại sao .NET không chuyển đổi đúng thời gian?

Tuy nhiên, TimeZoneInfo.ConvertTimeToUtc trừ một giờ khi tôi cố gắng chuyển đổi thời gian đã định thành thời gian UTC.

Tại sao điều này? Tôi có cần phải nói với phương pháp này rằng thời gian tiết kiệm ánh sáng ban ngày không hoạt động?

var now = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified); 
var convertedTime = TimeZoneInfo.ConvertTimeToUtc(now, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time")); 
Console.WriteLine(convertedTime); // subtracts one hour, even though England time and GMT should be equal 
+0

'W. Múi giờ của châu Âu Standard' không phải là 'UTC + 01.00'? –

+3

Bạn thực sự nên thử NodaTime http://noda-time.blogspot.com/ bởi @JonSkeet. Nó sẽ được bao gồm trong .NET dưới dạng API DateTime mới. –

+0

@Soner Gonul: Không, không phải. Không phải khi nó không phải là thời gian tiết kiệm ban ngày. –

Trả lời

7

Bạn chỉ đơn giản là đang sử dụng múi giờ sai. Anh đang ở trong múi giờ "Giờ chuẩn GMT".

Vùng "Giờ chuẩn châu Âu" dành cho lục địa Châu Âu, Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna, UTC + 01: 00.

+0

Bạn có chắc chắn về điều đó không? Trang web này nói, "Vương quốc Anh đang ở múi giờ Tây Âu." http://wwp.greenwichmeantime.com/time-zone/europe/uk/ –

+0

Đây là một số khác nói chính xác những gì tôi đang nói: WET = GMT, nhưng khi DST có hiệu lực, WET = GMT + 1. http: //wwp.greenwichmeantime.co.uk/time-zone/europe/uk/time/ –

+6

Vâng, tôi chắc chắn. Bạn sẽ cần phải sử dụng tên múi giờ Windows, không phải bất kỳ trang web nào gọi nó. –

2

[Chú ý: Câu trả lời này giả định máy tính chạy code đang trong múi giờ GMT]

Đó là bởi vì "W. châu Âu thời gian tiêu chuẩn" không phải là múi giờ giống như UTC theo Net (mặc dù nó phải là). Điều này rất kỳ quặc và có vẻ như một lỗi trong thư viện .Net.

Do đó, bạn vô tình yêu cầu chuyển đổi thời gian thành UTC và chuyển nó thành UTC (tức là giờ GMT) nhưng sau đó nói rằng thời gian nằm trong "Giờ chuẩn Châu Âu". một giờ trước UTC.

Vì vậy, tự nhiên, thời gian kết quả trong một giờ khác nhau.

Từng bước:

var now = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified); 

này đặt now để thời gian trong giờ UTC.

var convertedTime = TimeZoneInfo.ConvertTimeToUtc(now, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time") 

này chuyển now để UTC, giả định rằng now là trong "W. châu Âu thời gian chuẩn", ví dụ: tính theo giờ UTC + 1. Nhưng nó không phải là! Do đó kết quả không chính xác.

[EDIT để đáp ứng với ý kiến ​​dưới đây]

Lưu ý rằng "W. Europe Standard time"nên được tính theo giờ UTC, nhưng nó không phải là vì một lý do. Và khi bạn làm điều này:

TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard time") 

trả về UTC + 1 chứ không phải UTC chính xác (rõ ràng). Nó thậm chí còn thay đổi tên thành "W. Europe Daylight Time". Có vẻ như nó có thể là một lỗi tò mò?

[Second Chỉnh sửa]

Kiểm tra các Microsoft Time Zone Index Values (and also here). (Lưu ý Cả các liên kết thực sự cho Windows 7, nhưng chúng chứa các định nghĩa tương tự.)

Nó có một mục nhập cho "W. châu Âu Giờ chuẩn" mà chắc chắn khẳng định (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna

+0

Nếu bạn xem bất kỳ người chuyển đổi trực tuyến nào và bạn cố gắng chuyển đổi thời gian ở Vương quốc Anh thành UTC, bạn ' sẽ thấy rằng chúng giống nhau và chúng sẽ đến ngày 31 tháng 3. Tui bỏ lỡ điều gì vậy? –

+0

Bạn có ở Vương quốc Anh không? Nếu bạn đang có, mã của bạn sẽ gây ra thời gian để được ra bởi một giờ. –

+1

"Đó là bởi vì" W. Giờ chuẩn Châu Âu "không phải là múi giờ giống như UTC." Thật sao? Bạn có một tham chiếu cho điều đó? Bởi vì [Wikipedia không đồng ý với bạn] (http://en.wikipedia.org/wiki/Western_European_Time). – svick

-1

Vâng, hai chúng tôi có thời gian ở phía tây châu Âu, và thời gian mùa hè/ánh sáng ban ngày ở miền tây châu Âu phải không?Nó có thể là bằng cách nhập thời gian tiêu chuẩn Tây Âu, bạn sẽ tự động khớp với gần nhất, đó là mùa hè hoặc ánh sáng ban ngày - bất kể tiêu chuẩn được liệt kê là múi giờ hay không.

Ngẫu nhiên, giờ mùa hè của người Anh cũng giống như thời gian ban ngày/mùa hè ở Tây Âu. Và thời gian chờ đợi của Greenwich phù hợp với thời gian ở Tây Âu - cùng một múi giờ, nhưng BST đã bắt đầu lịch sử trước đó, trước khi phù hợp với các quy tắc của EU vào năm 2002. Có hiệu quả, cùng một tên hệ thống khác nhau.

+0

Điều này đã được trả lời và câu trả lời được đánh dấu là chính xác. Họ chỉ sử dụng id múi giờ Windows sai. –

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