Получить временную шкалу смещения сервера в С#
Как мне получить смещение часового пояса физического сервера, на котором запущен мой код? Не какой-либо объект даты или другой объект в памяти.
Например, следующий код выводит -4:00:00
:
<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>
Когда это должно быть -03:00:00
из-за летнего времени
Ответы
Ответ 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
, вы получите текущую дату и время и, следовательно, текущее смещение.