Тип, в котором хранятся смещения часового пояса, DateTimeOffset . Если вы заботитесь о смещениях, используйте этот тип вместо DateTime. В противном случае вы не сможете сравнивать даты с разными смещениями, если только вы не сохраните смещение вместе с датой и временем.
Такие свойства, как DateTimeOffset.Now и DateTimeOffset.UtcNow будут возвращать текущее время в часовом поясе или в формате UTC соответственно.
Создать DateTimeOffset из DateTime в определенном смещении так же просто, как вызвать соответствующий конструктор, например:
var pstTime=new DateTimeOffset(2019,1,14,1,0,0,new TimeSpan(-8,0,0));
Вы можете преобразовать значение DateTimeOffset
в различные смещения с помощью ToOffset , например:
var eastEuropeTime=pstTime.ToOffset(new TimeSpan(2,0,0));
Это вернется в 11 часов утра.
ToUniversalTime вернет время в UTC, т.е. +00: 00:
var utcTime=pstTime.ToUniversalTime();
Который возвращается в 9 утра.
Преобразование из / в DateTime
Вы также можете создать DateTimeOffset из существующего значения DateTime
. Конструктор проверяет входное свойство DateTime Kind и отказывается использовать недопустимые смещения, если DateTime.Kind
.
Для Utc единственным действительным значением является 00: 00.
var now=DateTime.UtcNow;
var utcOffset=new DateTimeOffset(now, TimeSpan.Zero);
utcOffset.Dump();
Для местного времени единственным действительным значением является смещение станка. Чтобы преобразовать местное время в DateTimeOffset, вы можете получить его смещение из TimeZoneInfo.Local
:
var now=DateTime.Now;
var localOffset=new DateTimeOffset(now, TimeZoneInfo.Local.GetUtcOffset(now));
Произвольные смещения
В некоторых случаях мы можем использовать DateTime как есть со специфическим смещением. Например, многие веб-сайты (особенно форумы) позволяют пользователям указывать свой часовой пояс и, таким образом, избегать проблем с определением часового пояса в браузере.
В других случаях смещение может быть сохранено отдельно или получено из имени часового пояса IANA.
Чтобы использовать произвольное смещение, тип DateTime должен иметь Unspecified
:
var date=new DateTime(2019,01,15,18.17.00, DateTimeKind.Unspecified);
var pst=new DateTimeOffset(date,new TimeSpan(-8,0,0));
Это полезно, например, при загрузке datetime
значений из базы данных. Значения DateTime, загруженные из базы данных: Unspecified
.
Значения, которые поступают из кода или элементов управления вводом, могут уже быть локальными или UTC. В этом случае нам нужно использовать DateTime.SpecifyKind , чтобы создать новое значение Unspecified
DateTime:
var date=DateTime.SpecifyKind(domeDate,DateTimeKind.Unspecified);
var pst=new DateTimeOffset(date,new TimeSpan(-8,0,0));