Как преобразовать DateTime типа DateTimeKind.Unspecified в DateTime.Kind.Utc в С# (.NET)
Я унаследовал код С#, который содержит очень много DateTimes, где свойство Kind является DateTimeKind.Unspecified. Они отправляются в Datetime.ToUniversalTime(), который возвращает дату и время UTC (это добавляет 7 часов в моем случае). Вот как работает ToUniversalTime(); см. MSDN. Проблема в том, что эти DateTimes на самом деле уже в UTC. Они извлекаются из базы данных SQL Server Compact 4.0. Они хранились там в UTC. Мой главный вопрос:
- Как изменить свойство Kind для DateTime, чтобы оно было UTC, а не Unspecified? Я не хочу менять время или дату. Так, например, дата 1 апреля 2013 года, 9:05 утра с свойством Kind, "Unspecified" должна стать датой 1 апреля 2013 года, 9:05 UTC.
Если бы я мог быть удовлетворен последующим вопросом (вопросами), это было бы:
- Обязательны ли значения из Sql Server Compact как "Unspecified"? Внутри Sql Server Compact они сохраняются как type (datetime, not null). Если посмотреть на код, кажется, что они просто помещены в базу данных, но нет никаких положений, чтобы обозначать их как UTC или что-то еще. Есть ли лучший способ справиться с вещами? Есть ли пятно способ гарантировать, что DateTimes выходят из SQL Compact как UTC?
Пожалуйста, дайте мне знать, если я могу предоставить более подробную информацию. Я новичок в этой базе кода и все еще обдумываю ее, поэтому у меня проблемы с описанием проблемы.
Дейв
Ответы
Ответ 1
Вам, может быть, нужно что-то вроде этого:
var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified);
var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc);
О методе "SpecifyKind()" из MSDN:
Метод SpecifyKind создает новый объект DateTime с использованием указанного параметра вида и исходного значения времени.
Он создаст новый объект, новый вид и значение времени. Вы не можете изменить вид существующего объекта, вам нужно создать новый с теми же значениями и разными типами.
Что касается другого вопроса, то здесь поддерживаются типы в SQL Compact. И вот вопрос относительно DateTimeOffset. Похоже, что он еще не поддерживается в Sql Compact.
Ответ 2
Я использую метод расширения:
public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{
var NewDT = New DateTime(DT.Year, DT.Month, DT.Day, DT.Hour, DT.Minute, DT.Second, DT.Millisecond, DTKind);
Return NewDT;
}
Это гораздо короче в LINQ, чем при необходимости каждый раз вводить DateTime.SpecifyKind(unspecified, DateTimeKind.Utc)
.
Например:
table.Where((x) x.StartTimeStampUTC.SetKind(DateTimeKind.Utc).ToString("G") = GUIStartTimeStampTxt.Text)
Ответ 3
Вы могли бы объединить два вышеупомянутых ответа для более чистого решения...
public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind)
{
return DateTime.SpecifyKind(DT, DTKind);
}