Я искал везде и не нашел ответа. Я хотел бы понять, что происходит с тем, как я форматирую параметр URL-адреса datetime (с часовым поясом).
Вот такая ситуация:
Вот тестовые примеры:
Дело 1: Это работает
http: // ****** / api / ItemSource / GetItemSourceOption? OrganizationCode = OKC & PoCreationDate = 2018-10-08T01: 02: 03.0000000-05: 00
Случай 2: Это не работает, и браузер отображает
<Error>
<Message>The request is invalid.</Message>
</Error>
http: // ****** / api / ItemSource / GetItemSourceOption? OrganizationCode = OKC & PoCreationDate = 2018-10-08T05: 00: 00.0000000 + 00: 00
Заметили разницу? у одного из них -05: 00, у другого +00: 00. Мой часовой пояс центральный (сейчас -05: 00?)
Случай 3: Моя текущая работа - отформатировать его таким образом http: // ****** / api / ItemSource / GetItemSourceOption? OrganizationCode = OKC & PoCreationDate = 2018-10-08T05: 00: 00Z
=====================
Так что я просто пытаюсь понять, что здесь происходит, и эти мои мысли ...
Я считаю, что использование формата Z - лучшее решение, поскольку значение DateTime (из источника) всегда находится в формате UTC.
Что касается -05: 00 и +00: 00, должны ли они быть установлены в соответствии с часовым поясом получателя (локальный часовой пояс сервера назначения)? Итак, в этом случае мой компьютер является приемником (WebAPI), и он настроен на центральный часовой пояс, поэтому это значение должно быть -05: 00, чтобы представлять текущее значение для центрального часового пояса?
Пожалуйста, помогите мне понять это. Спасибо.
Я не считаю это ответом, а скорее способом помочь вам найти хорошее решение. Один трюк, который я делаю, - это передать дату и время в виде двух параметров. Первый параметр - это дата / время как время файла (длинное значение), а второй параметр - часовой пояс или местный часовой пояс, в котором он находится. Таким образом, вы можете преобразовать его в соответствующее значение в фоновом режиме. Кроме того, избавьте себя от головной боли, сохраните всю дату / время в формате UTC. Так будет проще перевести его на местное время.
Я знаю, что вы говорите ... но с этим методом вам не нужно писать код для преобразования строк в DateTime. Процесс сериализации сделает это за вас автоматически.
Что касается -05: 00 и +00: 00, должны ли они быть установлены в соответствии с часовым поясом получателя (локальный часовой пояс сервера назначения)? Итак, в этом случае мой компьютер является приемником (WebAPI), и он настроен на центральный часовой пояс, поэтому это значение должно быть -05: 00, чтобы представлять текущее значение для центрального часового пояса? <<<< В этой части моего вопроса -05: 00 или +00: 00 указывает смещение часового пояса со стороны вызывающего абонента. Я считаю, что это правильное понимание.
Символ +
в смещении интерпретируется как пробел в соответствии с правилами кодирования URL. Вам нужно будет его закодировать, чтобы заменить на %2B
.
Если вы создаете этот URL-адрес из JavaScript, используйте функцию encodeURIComponent
.
Если вы создаете его на C#, используйте метод System.Net.WebUtility.UrlEncode
.
Обратите внимание, что это также заменит символы :
на %3A
, что является необязательным в параметре строки запроса, но все же рекомендуется.
Как правило, параметры, передаваемые в строке запроса, необходимо кодировать, если вы не можете гарантировать, что они не содержат специальных символов.
Кроме того, вы можете спросить себя, действительно ли это поле должно содержать полную дату + время + смещение. Во многих случаях можно ожидать, что поле типа PoCreationDate
будет просто датой, как в "2018-10-08"
. Конечно, это зависит от логики вашего приложения и бизнес-требований.
Боже мой ... как я мог забыть о кодировании. Вы абсолютно правы, сэр. Как только я изменил + на% 2B, он работает нормально. Спасибо :-)
Что ж, если вы думаете, что вам сейчас весело, подождите, пока сработает летнее время (или отключится, в зависимости от того, где вы находитесь на планете) ... проблемы с датой, временем и часовым поясом - это сложно ...