Рекомендации по сериализации DateTime в .NET 3.5

Примерно через 4 года я последовал этой статье MSDN для использования наилучших методов использования DateTime для создания .NET-клиента на веб-службах .NET и ASMX (с сервером SQL 2000 в качестве бэкэнд). Я все еще помню проблемы с сериализацией, которые у меня были с DateTime, и те усилия по тестированию, которые потребовались для серверов в разных часовых поясах.

Мои вопросы таковы: Есть ли подобный документ с передовыми методами для некоторых новых технологий, таких как WCF и SQL Server 2008, особенно с добавлением новых типов datetime для хранения информации о часовом поясе.

Это среда:

  1. SQL Server 2008 в Pacific Time.
  2. Веб-сервисы в другом часовом поясе.
  3. Клиенты могут использовать .Net 2.0 или .Net 3.5 в разных часовых поясах. Если это упростит, мы сможем заставить всех перейти на .Net 3.5. 🙂

Любые хорошие предложения / рекомендации по использованию типов данных, которые будут использоваться в каждом слое?

Я думаю, что лучший способ сделать это – всегда передавать объект как UTC и преобразовывать его в локальное время на клиентах. Таким образом, существует общая точка отсчета для всех клиентов.

Чтобы преобразовать в UTC, вызовите ToUniversalTime в объекте DateTime. Затем, на клиентах, вызовите ToLocalTime, чтобы получить его в своем текущем часовом поясе.

Одна из больших проблем заключается в том, что сериализация WCF не поддерживает xs: Date. Это большая проблема, так как все, что вам нужно, это дата, вы не должны заставлять вас беспокоиться о часовых поясах. Следующая проблема подключения обсуждает некоторые проблемы: http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215

Если вы хотите представить точку во времени однозначно, то есть не только часть даты, вы можете использовать class DateTimeOffset, если у вас есть .NET 3.5 как на клиенте, так и на сервере. Или для взаимодействия, всегда передавайте значения даты / времени в формате UTC.

UTC / GMT будет согласован в распределенной среде.

Важно отметить, что datetimeKind после заполнения вашего свойства DateTime значением из базы данных.

 dateTimeValueUtcKind = DateTime.SpecifyKind(dateTimeValue, DateTimeKind.Utc); 

См. MSDN

До тех пор, пока ваш уровень веб-сервисов и клиентский уровень используют тип .NET DateTime, он должен правильно сериализоваться и десериализоваться как стандартная локальная дата / время в формате SOAP с информацией о часовом поясе, например:

2008-09-15T13: 14: 36.9502109-05: 00

Если вы абсолютно, положительно должны знать сам часовой пояс (т. Е. Выше может быть восточное стандартное время или центральное летнее время), вам необходимо создать свой собственный тип данных, который раскрывает эти части как таковые:

 [Serializable] public sealed class MyDateTime { public MyDateTime() { this.Now = DateTime.Now; this.IsDaylightSavingTime = this.Now.IsDaylightSavingTime(); this.TimeZone = this.IsDaylightSavingTime ? System.TimeZone.CurrentTimeZone.DaylightName : System.TimeZone.CurrentTimeZone.StandardName; } public DateTime Now { get; set; } public string TimeZone { get; set; } public bool IsDaylightSavingTime { get; set; } } 

то ваш ответ будет выглядеть так:

 2008-09-15T13:34:08.0039447-05:00 Central Daylight Time true 

Мне повезло, просто сохранили тип данных DateTime и всегда сохраняли его как GMT. В каждом слое я бы изменил значение GMT ​​на локальное значение для слоя.

  • Ошибка WCF. Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт UserService.UserService.
  • Соединение не может быть выполнено, потому что целевая машина активно отказалась от него 127.0.0.1:3446
  • WCF: System.Net.SocketException - разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)
  • Подключение через именованный канал из службы Windows (сеанс # 0) в настольное приложение (сеанс # 1)
  • Как десериализация WCF создает объекты без вызова конструктора?
  • Различные формы интерфейса контракта службы WCF
  • Удалите объект JSON, отправленный из приложения Android в веб-службу WCF
  • Каковы последствия установки installSecurityContext = «False», если я использую https?
  • Ошибка WCF "Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, -« 65536 »
  • Пространство имен для
  • ServiceRoute + WebServiceHostFactory убивает генерацию WSDL? Как создать службу WCF без расширения с помощью? Wsdl
  • Interesting Posts

    В excel, не могу понять, почему цвет фона для ячейки не изменится?

    Не удалось создать миграции после обновления до ASP.NET Core 2.0

    Проверка распределения памяти в инструментах

    Почему подключенный раздел NTFS не отображается в файловом менеджере Linux?

    Java-swing прослушивает действие в текстовом поле формы

    Извлечение версии программного обеспечения Android

    Почему quicksort лучше, чем mergesort?

    Как поменять «fn» использование функциональных клавиш на * общей * клавиатуре в Linux

    Как изменить цвет текста кнопки диалога по умолчанию в android 5

    Как создать Qt 4.8 / 5.2 статически в VS2012, используя статическую среду выполнения MSVC, с поддержкой Windows XP?

    Выбор библиотеки пула Java JDBC в 2011/2012?

    Внедрение преобразователей для объектов с Java Generics

    Аутентификация форм: отключить redirect на страницу входа в систему

    Преобразование C: / partition в логический раздел

    Создайте обратный LinkedList в C ++ из данного LinkedList

    Давайте будем гением компьютера.