Подтвердить что ты не робот

Получить временную шкалу смещения сервера в С#

Как мне получить смещение часового пояса физического сервера, на котором запущен мой код? Не какой-либо объект даты или другой объект в памяти.

Например, следующий код выводит -4:00:00:

<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>

Когда это должно быть -03:00:00 из-за летнего времени

4b9b3361

Ответ 1

new DateTime() предоставит вам 1 января 0001 года, а не текущую дату/время. Я подозреваю, что вы хотите, чтобы текущее смещение UTC... и почему вы не видите смещение дневного света в вашем текущем коде.

Я бы использовал TimeZoneInfo.Local вместо TimeZone.CurrentTimeZone - это может не повлиять на вещи, но это определенно лучший подход. TimeZoneInfo во многом заменит TimeZone во всем коде. Затем вы можете использовать GetUtcOffset:

var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

(Использование DateTime.Now должно работать так же хорошо, но оно включает в себя некоторую магию за кулисами, когда вокруг есть переход на летнее время. DateTime на самом деле имеет четыре вида, а не рекламировали три, но проще всего избежать проблемы полностью, используя UtcNow.)

Или, конечно, вы могли бы использовать мою библиотеку Noda Time вместо всего этого мусора BCL;) (Если вы много работаете с датой/временем, d тщательно рекомендую это - очевидно - но если вы делаете только один бит, это, вероятно, будет излишним.)

Ответ 2

Начиная с .NET 3.5, вы можете использовать следующее из DateTimeOffset, чтобы получить текущее смещение.

var offset = DateTimeOffset.Now.Offset;

Документация MSDN

Ответ 3

Кажется, существует некоторая разница между тем, как GetUtcOffset работает с new DateTime() и DateTime.Now. Когда я запускаю его в Центральном часовом поясе, я получаю:

TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) // -06:00:00

TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)   // -05:00:00

Это немного клочья, но я полагаю, вы тоже могли бы это сделать:

DateTime.Now - DateTime.UtcNow // -05:00:00

Ответ 4

Когда вы заключаете новый объект DateTime, он получает DateTime.MinValue Когда вы получите его TimeZone.CurrentTimeZone.GetUtcOffset, вы на самом деле получите смещение по времени для этой даты. Если вы используете DateTime.Now, вы получите текущую дату и время и, следовательно, текущее смещение.