Чтение DateTime, сохраненное в UTC из базы данных T-Sql в С#
Я сохраняю datetime в t-sql db как UTC, а не локальное время, после сохранения, оно теряет, что это дата UTC ex: 2011-11-08 00:00:00.000
. Читая с db в С#, он читается как местное время, а не UTC. ex: после чтения значения dateTime a dateTime.ToUniversalTime()
дает другое значение.
Как читать значение datetime db как UTC, а не местное время? Или я должен был сохранить по местному времени в t-sql?
Ответы
Ответ 1
Хорошо, если вы получаете DateTime
с Kind
от Unspecified
, вы можете просто использовать:
DateTime utc = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);
Эта проблема является лишь одной из причин причин, по которым мне не нравится DateTime
.
Ответ 2
Jon Skeet решение не сработало для меня. По какой-то причине DateTime.SpecifyKind(date, DateTimeKind.Utc)
возвращает объект DateTime типа Unspecified
.
Однако после работы:
var date = DateTime.Parse("2017-03-07 00:15:2.663"); // Assuming UTC, Kind=Unspecified
date = TimeZoneInfo.ConvertTimeToUtc(date, TimeZoneInfo.Utc); // Assuming UTC, Kind=Utc
var output = Newtonsoft.Json.JsonConvert.SerializeObject(date); // "2017-03-07T00:15:02.663Z"
Ответ 3
Свойство Kind
Может быть: Local, UTC, Unspecified. Если вы просто инициализируете новый объект DateTime, то для параметра Kind
установлено значение "Локальный".
// read exact same time from DB, but leave the 'Kind' to be Unspecified
// PS Kind is not local, not utc here
(DateTime)(reader["dbdate"])
// read exact same time from DB, but set 'Kind' to be UTC
// if your date in your DB is also utc time, then use this one
DateTime.SpecifyKind((DateTime)(reader["dbdate"]), DateTimeKind.Utc)