У нас запущено приложение для планирования, которое вызывает службу WCF для выполнения ночных заданий. Многие из них включают информацию о текущей деловой дате. По деловым причинам сервер расписания настроен на время по Гринвичу, но наша служба работает на серверах, настроенных на время Нью-Йорка.
Это создает проблему; даты передаются в нашу службу .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;
}





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