Чтение 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)