Linq к значениям SQL DateTime локальны (Kind=Unspecified) - Как я делаю его UTC?

TrackError специально для отслеживания обнаруженных исключений.

58
задан ericsson007 4 May 2009 в 17:16
поделиться

5 ответов

Единственный способ, которым я могу думать, это добавить свойство shim в частичный класс, который выполняет перевод ...

5
ответ дан 7 November 2019 в 05:34
поделиться

DateTime SQL Server не включает никаких информация о часовом поясе или DateTimeKind, поэтому значения DateTime, правильно извлеченные из базы данных, имеют Kind = DateTimeKind.Unspecified.

Если вы хотите сделать это время в формате UTC, вы должны «преобразовать» их следующим образом:

DateTime utcDateTime = new DateTime(databaseDateTime.Ticks, DateTimeKind.Utc);

или эквивалент:

DateTime utcDateTime = DateTime.SpecifyKind(databaseDateTime, DateTimeKind.Utc);

Я предполагаю, что ваша проблема в том, что вы пытаетесь преобразовать их следующим образом:

DateTime utcDateTime = databaseDateTime.ToUniversalTime();

На первый взгляд это может показаться разумным, но согласно документации MSDN для DateTime.ToUniversalTime при преобразовании DateTime, Kind не указано:

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

Такое поведение необходимо для обратной совместимости с .NET 1.x, у которого не было свойства DateTime.Kind.

28
ответ дан 7 November 2019 в 05:34
поделиться

Пара разных способов сделать это:

  1. Если указанная вами структура папок является желаемой структурой веб-папок, то любое из ваших приложений ASP.NET может просто ссылаться на / root / js / something .js или ../js/whatever.js, и он попадет в папки, которые у вас уже есть в корне. Это альтернатива уже упомянутому решению виртуальных каталогов. Это довольно запутанное решение, которое делают некоторые из проектов, которые я унаследовал на моей текущей работе.
  2. На предыдущей работе я пару лет управлял гибридным классическим приложением ASP / ASP.NET, и я сделал это, сделав веб-приложение ASP.NET в корне и перемещение в него всех моих страниц ASP. Любые «суб-приложения», которые вы хотите создать, должны быть просто папками в этом единственном проекте. [ASP-страницы больше не имеют цветовой кодировки в VS2008,
-1
ответ дан 7 November 2019 в 05:34
поделиться

Я хочу, чтобы UTC, класс TimeZone может сделать это за вас, если вы хотите конвертировать между разными часовыми поясами, TimeZoneInfo для вас. Пример из моего кода с TimeZoneInfo:

TimeZoneInfo cet = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
ac.add_datetime = TimeZoneInfo.ConvertTime(DateTime.Now, cet);            
-4
ответ дан 7 November 2019 в 05:34
поделиться

Сгенерированный код LinqToSql предоставляет точки расширяемости, поэтому вы можете устанавливать значения при загрузке объектов.

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

Например, предположим, что ваш класс - Person , поэтому у вас есть сгенерированный частичный класс Person в Blah.designer.cs .

Расширьте частичный класс, создав новый класс (должен находиться в другом файле), как показано ниже:

public partial class Person {

  partial void OnLoaded() {
    this._BirthDate = DateTime.SpecifyKind(this._BirthDate, DateTimeKind.Utc);
  }
}
37
ответ дан 7 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: