Проблема с часовым поясом C# при использовании specifyKind

#c# #datetime

Вопрос:

У меня проблема с использованием SpecifyKind. Я обнаружил, что если я применю строку(«O») к дате и времени.Сейчас или до нового времени() , у меня будет другое время . Я не представляю, как это возможно. Я пытаюсь сохранить эти даты в базе данных в формате Utc, но из-за того , что интервал отличается, время будет неправильным.
Вот что я делаю:

 var now = DateTime.Now;  var nowst = now.ToString("O", CultureInfo.InvariantCulture);  var dattt = new DateTime(2020,07,20,09,44,09, DateTimeKind.Local);  var datttst = dattt.ToString("O", CultureInfo.InvariantCulture);  

сейчас: 2021-12-08 13:40:35 сейчас: 2021-12-08T13:40:35.1159209 01:00 дата : 2020-07-20 09:44:09 дата :2020-07-20T09:44:09.0000000 02:00″

Ответ №1:

При сохранении в БД вы хотите сохранить дату и время UTC, чтобы избежать разницы во времени, как вы уже упоминали, но лучший способ сделать это в C#-использовать UtcNow, значение «O»-это просто получить представление значения ISO-8601. Если ваше время уже указано в UTC, вы не получите дополнение GMT к строке ISO-8601.

 var utcNow = DateTime.UtcNow; var utcNowO = utcNow.ToString("O", CultureInfo.InvariantCulture); Console.WriteLine($"DateTime UtcNow: {utcNow} =gt;ISO-8601 of it: {utcNowO}");  

Что касается того, почему разница в значениях в вашем вопросе, это летнее время, если вы выберете UtcNow, вы можете полностью игнорировать ее и сохранить значение в бд. При чтении из БД вы можете снова преобразовать его в местное время, которое будет учитывать GMT для местного часового пояса.
Как с переходом на летнее время, — что не могут быть приняты во внимание, из коробки, поскольку они могут быть арбитром решений, принятых правительствами. т. е. В Израиле — меньше месяца назад правительство приняло решение установить часы на GMT 3, чтобы приспособиться к дневному свету, он всегда был мск 2 до тех пор в течение многих лет.. ваш код, выполняемый в будущем, не будет знать, что такое решение было принято в прошлом всего за несколько месяцев из коробки. Если вы хотите, чтобы ваш код «знал», что в будущем вам следует сохранить местное время с разницей во времени вместо даты UTC.