[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
'W. Múi giờ của châu Âu Standard' không phải là 'UTC + 01.00'? –
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. –
@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. –