Подтвердить что ты не робот

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

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

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

Это среда:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

См. MSDN

Ответ 4

Пока ваш уровень веб-сервисов и клиентский уровень используют тип .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;
    }
}

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

<Now>2008-09-15T13:34:08.0039447-05:00</Now>
<TimeZone>Central Daylight Time</TimeZone>
<IsDaylightSavingTime>true</IsDaylightSavingTime>

Ответ 5

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