Как конвертировать дату и время, используя значения смещения - PullRequest
0 голосов
/ 14 января 2019

Мне нужно преобразовать аккорд DateTime в заданное значение смещения. У меня есть такие значения, как:

-08: 00

-07: 00

+ 08: 00

+ 07: 00

+ 02: 00

+ 05: 30

Как я могу преобразовать дату в соответствии с этими данными значениями смещения. Я попробовал:

string t = "Pacific Standard Time";
var tInfo = TimeZoneInfo.FindSystemTimeZoneById(t);
var data = TimeZoneInfo.ConvertTime(DateTime.Now, tInfo);

это нормально, но мне нужно конвертировать на основе значения смещения.

Пожалуйста, предложите здесь, как конвертировать его.

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Тип, в котором хранятся смещения часового пояса, 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));
0 голосов
/ 14 января 2019

Можно использовать DateTimeOffset.Parse

Например:

var offsetValue = "+08:00";
var now = DateTime.Now;
var nowString = now.ToString("dd/MM/yyyy HH:mm:ss");
var offsetDateTime = DateTimeOffset.Parse($"{nowString} {offsetValue}");

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

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