Вопрос

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

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

Это среда:

  1. SQL-сервер 2008 по тихоокеанскому времени.
  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

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

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

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

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

См. MSDN

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

09/15/2008 20:14:36

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

[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>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top