Беспорядок в часовых поясах с использованием WCF - PullRequest
6 голосов
/ 18 мая 2011

У меня есть система SaaS с несколькими клиентами по всему миру. Однако каждый клиент находится только в одном часовом поясе. Связь между клиентом и моим центральным сервером осуществляется с помощью WCF.

Теперь в системе есть аспект планирования, и время должно быть сохранено в терминах местного времени. Но я обнаружил, что когда я отправляю класс, помеченный атрибутом DataContract, обладающим свойством DataMember типа DateTime через интерфейс WCF, система становится слишком умной вдвое и переводит время в серверное время. OTOH, если я передам значение DateTime непосредственно через интерфейс WCF в качестве параметра, время будет дословно, как время клиента.

Это вызывает у меня много головной боли. Есть ли что-то, что я могу где-то настроить, чтобы служба WCF не переводила время в локальное (серверное) время?

РЕДАКТИРОВАТЬ: Ну, я не знаю, что я сделал, но я работал над некоторыми связанными вещами, и проблема, кажется, просто исчезла! Поэтому я бы с удовольствием попробовал ваши ответы, но на самом деле я не могу сейчас воспроизвести свою собственную проблему ... Если бы у меня было время для академического упражнения, я бы посмотрел глубже, но сейчас, если он не сломался ...

Ответы [ 3 ]

9 голосов
/ 18 мая 2011

WCF не имеет возможности автоматически преобразовывать значения времени в время UTC. Вы можете использовать и хранить UTC время для вашего приложения. Конечно, вам нужно отменить это преобразование при отображении этих значений в пользовательском интерфейсе.

4 голосов
/ 21 июля 2011

Я знаю, что это старый вопрос, но если кому-то нужно, вот он:

Полагаю, вы делаете DateTime.Now на стороне клиента. Вместо этого выражения используйте:

DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified)

Получает локальный dateTime клиента и не изменяется на сервере.

2 голосов
/ 18 мая 2011

Попробуйте использовать объекты DateTimeOffset - смещение часового пояса также сохраняется, и если время переведено, вы сможете перевести его обратно.Вам необходим .NET 3.5 или более поздняя версия.

Вам придется немного изменить свой код, поскольку DateTimeOffset и DateTime нельзя приводить друг к другу (их можно преобразовать).

У вас не должно бытьдля изменения вызовов хранимых процедур, но если вы обнаружите необходимость, DateTimeOffset также существует в SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...