2008-11-03 2 views
5

У нас есть приложение для планирования, которое вызывает службу WCF для запуска ночных заданий. Большое количество из них включает информацию о текущей деловой дате. По бизнес-причинам сервер планирования настроен на GMT, но наша служба работает на серверах, установленных на NY.Обработка десериализации WCF объектов DateTime

Возникает проблема; даты передаются нашей службе .NET с явной информацией о часовом поясе. Поэтому, когда служба заявляет, что приложение запускается с датой «2008-11-03 00:00:00 +0: 00», служба интерпретирует это как «2008-11-02 19:00:00 -5: 00 «и все работает с неправильной датой.

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

Есть ли способ отметить DataContract или даже контролировать его на достаточно низком уровне, чтобы удостовериться, что DateTime Kind будет Unspecified? Или есть способ с DateTime, чтобы определить, какая исходная информация использовалась для его создания, и преобразовать его обратно в исходное значение на этапе последующей обработки?

Если это помогает, прямо сейчас наш контракт довольно прост. Методы принимают один параметр, который является классом, полученным из приведенного ниже класса.

[DataContract] 
public class BaseTimeSensitiveParameters 
{ 
    [DataMember] public DateTime? BusinessDate; 
} 
+0

Если вы хотите, чтобы сервер планирования настроен на GMT, установите часовой пояс ОС на GMT. – 2008-11-03 16:21:33

ответ

3

Если я правильно понял проблему правильно, вы могли бы решить эту проблему в постобработки, просто используя DateTime.ToUniversalTime() на стороне службы. Для вашего примера это должно получить вам DateTime со значением «2008-11-03 00:00:00» и Kind = DateTimeKind.Utc. Теперь, если вам нужно это же значение, но как локальное или Unspecified, вы можете использовать DateTime.SpecifyKind(DateTime, DateTimeKind) для установки Kind без изменения значения.

+0

Да ... сохраняйте то, что служба возвращает в UTC, оставляйте ее клиенту для преобразования или интерпретации. – 2009-04-14 02:57:12

Смежные вопросы