Преобразование часового пояса datetime в веб-службе .net
-
03-07-2019 - |
Вопрос
У меня есть веб-служба (на самом деле служба 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.