2017-02-14 19 views
3

Почему метод IsDaylightSavingTime() возвращает явно неправильное значение для определенного диапазона часов? Чтобы быть однозначным, я начинаю с даты UTC. Время new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc) - последняя минута DST для WEST. Действительно, в WEST он дает 2 часа смещения (2,59 утра), а через минуту происходит смещение 1 часа (2,00 утра). Но тогда почему:IsDaylightSavingTime странное поведение

TimeZoneInfo.ConvertTimeFromUtc(
    new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc), 
    TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time") 
).IsDaylightSavingTime() 

возвращает false ?!

Этот метод возвращает false, начиная с new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc) (но почему?), Второй до, new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc), он возвращает true.

методы В TimeZoneInfo, кажется, работает:

var thisIsTrue = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time").IsDaylightSavingTime(new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc)); 

    var thisIsFalse = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")).IsDaylightSavingTime(); 
+1

Я запустил этот код в VS 2015 Community, и все три даты, которые вы указали, верны для меня. Не могли бы вы подробно описать свою среду? –

+0

Я запускаю этот код на VS 2015, мой часовой пояс W. Europe Standard Time, есть ли что-то еще, что вам может понадобиться? –

+1

Не уверен. Я нашел ».IsDaylightSavingTime() 'вернет false, если дата не отформатирована правильно или неоднозначна, но я не замечаю ошибки в коде, которые могли бы вызвать это. Есть ли большой фрагмент кода? https://msdn.microsoft.com/en-us/library/system.datetime.isdaylightsavingtime(v=vs.110).aspx –

ответ

0

Кейси-О'Брайен прав в своем комментарии. Причина в том, что после перевода в мой местный часовой пояс все часы между 2,00 и 2,59 утра стали двусмысленными, так как они встречаются дважды: один раз до окончания dst и один раз после. Вот почему метод возвращает false.

Casey, если вы напишете свой комментарий в качестве ответа, я приму это. Спасибо.

0

В 2016 Переход на летнее время в Европе завершились 30 октября. Поэтому, насколько я могу видеть, что IsDaylightSavingTime() возвращает false, абсолютно корректно. В 2015 году дневные сбережения закончились 25 октября, и если вы заполните эту дату и 24 октября 23:59, вы получите те же результаты.

Относительно времени.

Использование TimeZoneInfo.ConvertTimeFromUtc вернет DateTime (10/30/2016 02:59:59), где DateTimeKind - Unspecified, что означает, что он назовет TimeZoneInfo.Local.IsDaylightSavingTime и вернет False. Хотя пропускании UTC DateTime в TimeZoneInfo.Local.IsDaylightSavingTime так:

TimeZoneInfo.Local.IsDaylightSavingTime(new DateTime(2016, 10, 30, 0, 59, 59, DateTimeKind.Utc)); 

Вызовет различного рода расчетов необходимо сделать, а именно:

Boolean isDaylightSavings; 
GetUtcOffsetFromUtc(dateTime, this, out isDaylightSavings); 
return isDaylightSavings; 

Я думаю, что расчет имеет некоторые отличия из-за неявного преобразования против явных преобразований. DateTime немного раздражает этими вещами, и поэтому в наши дни я склоняюсь к Noda time.

+0

30 октября 2016 года в 2.59 утра (0.59 UTC), то есть точка ... –

+0

@MassimilianoCarosi Я обновил свой ответ, включив в него проблему времени. – Rutix

0

Метод ConvertTimeFromUtc возвращает DateTime тип, который имеет другую реализацию метода IsDaylightSavingTime с использованием TimeZoneInfo типа.

Попробуйте следующий код вместо ...

var date = new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc); 
var foo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time").IsDaylightSavingTime(date); 
+0

Этот ответ не отвечает на его вопрос. Это точно так же, как сейчас. – Rutix

+0

это не отвечает, но указывает, что метод TimeZoneInfo работает отлично, вместо этого я добавил дополнительную информацию к вопросу –

Смежные вопросы