2016-08-15 1 views
0

Я пытаюсь понять, почему моя дата неправильно:UTC преобразуется в Центральной Европе поясному времени 2 часа перед не 1

DateTime databaseUtcTime = new DateTime(2016, 8, 15, 10, 20, 0, DateTimeKind.Utc); 
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time"); 
var testDateTime = TimeZoneInfo.ConvertTimeFromUtc(databaseUtcTime, timeZone); 

testDateTimeвыходы 15/08/2016 12:20:00, а не 15/08/2016 11:20:00 Почему это? Не должно быть 1 часа вперед от UTC, а не 2?

EDIT ----

Спасибо Джон Скит,

Если это помогает любому, я прибегал к использованию:

if(testDateTime.IsDaylightSavingTime()) 
{ 
    testDateTime = testDateTime.AddHours(-1); 
} 

Albeit не зная контекста, это может быть полезно знать, как избавиться от летнего времени при выполнении определенных явных тестов вовремя.

+2

Пришло время, чтобы превратиться в NodaTime. (Это хорошая фраза): https://github.com/nodatime/nodatime – user3185569

ответ

2

Часовой пояс с идентификатором «Центральноевропейское стандартное время» - это тот, который используется Центральной Европой ... это не действительно среднее время.

Поскольку в настоящее время в Центральной Европе наблюдается переход на летнее время, смещение на самом деле составляет UTC + 2.

Очень жаль, что идентификаторы, используемые в часовых поясах Windows, вводят в заблуждение, как это ... но сама реализация TimeZoneInfo верна.

(Это не все, что случилось с именами времени для Windows зоны ... см Matt Johnson's пост по этому вопросу для более ...)

+1

Джон Скит, версия для программистов Jo (h) n Cena. – Jimmyt1988

+0

@ Jimmyt1988 Люди будут спорить, если это комплимент, так как вы сравнили его с тем, кто принимает смешанные реакции. Это не относится к мистеру Скиту. – user3185569

+0

Hahaha @ user3185569 - Извините, я должен был сказать chuck norris. – Jimmyt1988