Как отформатировать параметр datetime url с часовым поясом

Я искал везде и не нашел ответа. Я хотел бы понять, что происходит с тем, как я форматирую параметр URL-адреса datetime (с часовым поясом).

Вот такая ситуация:

  1. Программа вызывающего абонента имеет значение DateTime с часовым поясом UTC.
  2. Приемник Json WebAPI (C#) работает на моем локальном компьютере с центральным часовым поясом.
  3. PoCreationDate - это тип DateTime (C#). Я не пишу код для анализа значения PoCreationDate. C# преобразовал его в объект 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, чтобы представлять текущее значение для центрального часового пояса?

Пожалуйста, помогите мне понять это. Спасибо.

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

Zohar Peled 25.10.2018 18:00

Я не считаю это ответом, а скорее способом помочь вам найти хорошее решение. Один трюк, который я делаю, - это передать дату и время в виде двух параметров. Первый параметр - это дата / время как время файла (длинное значение), а второй параметр - часовой пояс или местный часовой пояс, в котором он находится. Таким образом, вы можете преобразовать его в соответствующее значение в фоновом режиме. Кроме того, избавьте себя от головной боли, сохраните всю дату / время в формате UTC. Так будет проще перевести его на местное время.

tj-cappelletti 25.10.2018 18:08

Я знаю, что вы говорите ... но с этим методом вам не нужно писать код для преобразования строк в DateTime. Процесс сериализации сделает это за вас автоматически.

Fearless Coder 26.10.2018 22:37

Что касается -05: 00 и +00: 00, должны ли они быть установлены в соответствии с часовым поясом получателя (локальный часовой пояс сервера назначения)? Итак, в этом случае мой компьютер является приемником (WebAPI), и он настроен на центральный часовой пояс, поэтому это значение должно быть -05: 00, чтобы представлять текущее значение для центрального часового пояса? <<<< В этой части моего вопроса -05: 00 или +00: 00 указывает смещение часового пояса со стороны вызывающего абонента. Я считаю, что это правильное понимание.

Fearless Coder 26.10.2018 22:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
2 046
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Символ + в смещении интерпретируется как пробел в соответствии с правилами кодирования URL. Вам нужно будет его закодировать, чтобы заменить на %2B.

  • Если вы создаете этот URL-адрес из JavaScript, используйте функцию encodeURIComponent.

  • Если вы создаете его на C#, используйте метод System.Net.WebUtility.UrlEncode.

Обратите внимание, что это также заменит символы : на %3A, что является необязательным в параметре строки запроса, но все же рекомендуется.

Как правило, параметры, передаваемые в строке запроса, необходимо кодировать, если вы не можете гарантировать, что они не содержат специальных символов.

Кроме того, вы можете спросить себя, действительно ли это поле должно содержать полную дату + время + смещение. Во многих случаях можно ожидать, что поле типа PoCreationDate будет просто датой, как в "2018-10-08". Конечно, это зависит от логики вашего приложения и бизнес-требований.

Боже мой ... как я мог забыть о кодировании. Вы абсолютно правы, сэр. Как только я изменил + на% 2B, он работает нормально. Спасибо :-)

Fearless Coder 26.10.2018 22:39

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