Как преобразовать 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. Мой главный вопрос:

  1. Как изменить свойство Kind для DateTime, чтобы оно было UTC, а не Unspecified? Я не хочу менять время или дату. Так, например, дата 1 апреля 2013 года, 9:05 утра с свойством Kind, "Unspecified" должна стать датой 1 апреля 2013 года, 9:05 UTC.

Если бы я мог быть удовлетворен последующим вопросом (вопросами), это было бы:

  1. Обязательны ли значения из 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);
}