Чтение DateTime, сохраненного в UTC из базы данных T-Sql в C # - PullRequest
18 голосов
/ 11 ноября 2011

Я сохраняю дату и время в t-sql db как UTC, а не местное время, т.е. после сохранения теряется, что это дата UTC, например: 2011-11-08 00:00:00.000. При чтении из базы данных в C # он читается как местное время, а не как UTC. пример: после чтения значения dateTime, dateTime.ToUniversalTime() дает другое значение.

Как мне прочитать значение даты и времени в БД как UTC, а не по местному времени? Или мне стоит сэкономить по местному времени в t-sql?

Ответы [ 3 ]

25 голосов
/ 11 ноября 2011

Хорошо, если вы получаете DateTime с Kind из Unspecified, вы можете просто использовать:

DateTime utc = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);

Проблема такого рода является лишь одной из причин, по которым мне не нравится DateTime.

0 голосов
/ 18 января 2018

Свойство Kind Может быть: Local, UTC, Unspecified.Если вы просто инициализируете новый объект DateTime, для Kind по умолчанию будет установлено значение Local.

// 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) 
0 голосов
/ 07 марта 2017

Решение Джона Скита не сработало для меня.По какой-то причине 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"
...