Intereting Posts
Британский формат даты на сервере отчетов превращается в формат США на стороне клиента через MS SSRS Создание реализаций интерфейса async Exchange Web Service FolderId для неизвестного имени папки Введите имя пользователя и пароль на страницу входа в систему C # Не показывать расширения фильтра в OpenFileDialog Windows Phone 8 Geolocator не может установить желаемое значениеAccuracy = высокий и привязывается к событию PositionChanged Как получить несколько Set-Cookie из WebResponse? c # регулярное выражение соответствует определенному индексу в строке? Когда следует использовать поле, а не свойство? заполните текстовые поля, выбрав выпадающий список в mvc Как я могу разрешить ввод только 0 или 1 в TextBox? Каков наиболее эффективный способ сохранения массива байтов как файла на диске в C #? Как поместить необработанные (экранированные) слова внутри String.Format Совместимость C # и MATLAB для нематричных типов данных Как запретить пользователю вводить логин из нескольких мест или из разных браузеров на одном компьютере

Как преобразовать DateTime типа DateTimeKind.Unspecified в DateTime.Kind.Utc в C # (.NET)

Я унаследовал код C #, который содержит очень много 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?

Пожалуйста, дайте мне знать, если я могу предоставить более подробную информацию. Я новичок в этой базе кода и все еще обдумываю ее, поэтому у меня проблемы с описанием проблемы.

Дейв

Вам, может быть, нужно что-то вроде этого:

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.

Я использую метод расширения:

 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) 

Вы могли бы объединить два вышеупомянутых ответа для более чистого решения …

 public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind) { return DateTime.SpecifyKind(DT, DTKind); }