Преобразование часового пояса datetime в веб-службе .net

StackOverflow https://stackoverflow.com/questions/607727

Вопрос

У меня есть веб-служба (на самом деле служба Silverlight Enable WCF, но по сути это веб-служба) с методом, принимающим параметр datetime.Метод вызывается от клиента, который может находиться в другом часовом поясе.Служба, в которой размещается веб-служба, использует стандартное тихоокеанское время, и, похоже, веб-служба преобразует значение даты и времени в часовой пояс сервера.Целью веб-службы является сравнение значения даты и времени со значением в базе данных, но значение в базе данных основано на часовом поясе клиента, поэтому из-за преобразования сравнение не работает.

Есть ли способ отключить конвертацию?

Это было полезно?

Решение

и похоже, что веб-служба преобразует значение даты и времени в часовой пояс сервера.

Я пытаюсь убедиться, что это правильно:метод вашего веб-сервиса принимает параметр типа DateTime (например, System.DateTime) и преобразует переданный параметр?

Объекты DateTime не содержат неявного часового пояса, поэтому любое решение веб-службы вывести местное время будет логическим недостатком (по крайней мере, без поддержки критериев часового пояса).

Если вы предоставите фрагменты кода вашего сервера и клиента, это облегчит диагностику сценария.

ОБНОВЛЯТЬ:Не уверен, что этот сценарий верен, поэтому уточните:

  • Клиент отправляет запрос со значением DateTime «12:00:00 00:00:00 PM CST».
  • Сервер в PST получает/интерпретирует запрос в '22:00:00 00:00:00 PST'

Если это так, можете ли вы преобразовать все данные во время UTC?Если вы выполняете поиск по запросу, это также подразумевает преобразование сохраненных данных в формат UTC.

Другие советы

Не совсем верно, что экземпляры DateTime (структуры) не несут информацию о TimeZone.Eсть ДатаВремяВид свойство в каждой структуре DateTime, начиная с .NET...3.0?Я не знаю версию.«Вид» — это UTC, местный или неопределенный.поэтому, хотя это не часовой пояс как таковой, это указание на то, что время выражено либо в местном часовом поясе, либо в универсальном часовом поясе.Проверьте документ для получения дополнительной информации.

Чтобы ответить на исходный вопрос - перевести всех в единый стандартный часовой пояс.UTC работает нормально и легко, поскольку в BCL есть встроенные методы, но на самом деле не имеет значения, какой часовой пояс вы выберете.Просто заставьте всех прийти к согласию по поводу стандарта.

Еще одна вещь, которую вы можете сделать, это передать значения времени как значения «TotalSeconds», поскольку...какое-то конкретное время в прошлом.Например, 1 января 1970 года (unix time_t) или 1 января 1601 года (Windows FILETIME).Но в этом подходе неявно подразумевается, что все сотрудничающие стороны согласны с тем, что этой начальной точкой времени является UTC.Таким образом, миллион секунд с начала («эпоха») относится к одному и тому же моменту, нахожусь ли я в Эль-Пасо, Нашуа, Токио или Лондоне.

Посмотрите этот вопрос, в нем есть обсуждение того, чего вы хотите.

Похоже, самый простой способ — передать часовой пояс клиента в веб-методе или просто передать все время в виде строки, а не DateTime.

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