Начало зимнего времени в C # - PullRequest
1 голос
/ 03 мая 2019

Сейчас мы находимся в летнее время (UTC + 01: 00), но мне всегда нужно зимнее время, где бы я ни был.

Например, сейчас время 08:05, а зимой 07: 05

С помощью этой функции я могу узнать, экономит ли это время или нет

DateTime.Now.IsDaylightSavingTime()

а вот дельта (смена 1 час)

TimeZoneInfo.Local.GetAdjustmentRules()[0].DaylightDelta;

так что, если я сделаю что-то подобное, это правильно?

var winterTime= DateTime.Now;
if (DateTime.Now.IsDaylightSavingTime())
{
  winterTime = DateTime.Now.AddHours(-1 * delta.Hours);
}

или есть другой способ сделать? (без использования какого-либо третьего решения)

Редактировать: причина, по которой я спрашиваю об этом, заключается в том, что мы прошиваем прошивку на устройство nfc, а некоторые даты на устройствах должны быть в зимнее время. Вот почему наш инструмент должен записывать зимнее время в качестве параметра устройства.

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Если DaylightDelta не целые часы, лучше использовать TimeSpan напрямую.Также вам нужно найти правило в GetAdjustmentRules(), соответствующее текущей дате.GetAdjustmentRules() возвращает как будущие, так и исторические правила.

var now = DateTime.Today;
var rule = TimeZoneInfo.Local.GetAdjustmentRules().Where(x => now >= x.DateStart && now <= x.DateEnd).First();
winterTime = DateTime.Now - rule.DaylightDelta;
1 голос
/ 04 мая 2019

Сейчас мы находимся в летнее время (UTC + 01: 00), но мне всегда нужно зимнее время, где бы я ни был.

...

... Причинапочему я спрашиваю, это то, что мы прошиваем прошивку на устройство nfc и некоторые даты на устройствах должны быть в зимнее время.Вот почему наш инструмент должен записывать зимнее время в качестве параметра для устройства.

Похоже, вы просто хотите получить время UTC для установки на устройстве.Если это так, просто используйте DateTime.UtcNow.Нет необходимости беспокоиться о часовых поясах.

Однако, если вы действительно хотите взять стандартное время (или зимнее время) для любого местного часового пояса, в котором вы находитесь (это может показаться немногоглупо, потому что это не так, как работает местное время), но если вы действительно уверены, что хотите этого, вы можете сделать это без запроса правил настройки.Вместо этого попробуйте следующее:

DateTime dt = DateTimeOffset.UtcNow.ToOffset(TimeZoneInfo.Local.BaseUtcOffset).DateTime;

Это берет текущее время UTC, применяет смещение base местного часового пояса, а затем возвращает DateTime с .Kind == DateTimeKind.Unspecified,Базовое смещение - это смещение от UTC, которое применяется в течение стандартного времени без каких-либо правил корректировки, применяемых для летнего времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...