Временные зоны обработки MVC и сериализация JSON - как преобразовать в конкретный часовой пояс

.net-4.5 asp.net-mvc-5 entity-framework-6 json.net timezone

Вопрос

Я потратил немало времени на stackoverflow и интернет, пытаясь определить, что было сделано в моей ситуации. Я создаю централизованный бизнес-сайт, который может охватывать несколько часовых поясов. Основываясь на некоторой ценной информации, здесь у меня есть план, чтобы справиться с этим.

Теперь к вопросу я не знаю, как решить. Пользовательский интерфейс Kendo использует JSON для передачи информации взад и вперед, и насколько я могу судить, сериализатор JSON.net не может сериализовать дату в определенный часовой пояс. Я могу сериализовать дату как UTC или JSON.net автоматически преобразует ее в локальное время с помощью параметра DateTimeZoneHandling, но это будет локальное время на сервере. От взгляда на код JSON.net я не уверен, что даже могу написать конвертер, чтобы делать то, что я хотел. Пока что, если я отправлю дату в формате UTC через JSON.net, и Kendo автоматически преобразует время в локальный часовой пояс браузера.

Предполагая часовой пояс пользовательского профиля = Часовой пояс браузера кажется немного страшным для меня, и я хотел посмотреть, что предлагает пакет stackoverflow. Заранее спасибо.

Технологии

ASP.net MVC 5

Entity Framework 6

Органы управления Telerik Kendo UI

JSON.net

Принятый ответ

Я, наконец, смог найти этот ответ здесь https://stackoverflow.com/a/11968692/3412859 , который позволит мне написать собственный JSON-конвертер и преобразовать его в определенный часовой пояс до его сериализации. Теперь у меня есть все даты, которые преобразуются на стороне сервера на основе настройки часового пояса в профиле пользователя.


Популярные ответы

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

Я бы использовал UTC везде, кроме случаев отображения времени (или, скорее, datetimes) и ввода пользователем.

Я бы хотел, чтобы JavaScript браузера выполнял преобразование на выходе, используя часовой пояс браузера. На входе преобразование может быть выполнено либо на стороне клиента, либо на стороне сервера. В последнем случае часовой пояс должен быть частью информации, отправленной из браузера на сервер. Часовой пояс UTC на серверах должен быть установлен как можно ниже на минимальном уровне и, по возможности, во всех компонентах (ОС, веб-сервере, БД ...).

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

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

Что касается вашего последнего абзаца: вы очень скоро столкнетесь с неприятностями, если предположите «часовой пояс пользователя профиля = часовой пояс браузера».

Некоторые последние слова совета:

  • «Часовой пояс» - двусмысленный термин. Он может относиться к фиксированному смещению от UTC (например, UTC + 1) или к правилам расчета этого смещения за любой момент в данной области (например, часовой пояс в Риме, Италия). Всегда используйте второе значение (например, не используйте текущее смещение для даты в будущем или в прошлом, но правильно конвертируйте данные снова и снова), и помните, что оба могут измениться во время сеанса пользователя.
  • Будьте осторожны, чтобы не обрабатывать «чистые» даты как полночь того же дня (а не как полдень - люди в Самоа будут вам благодарны), потому что тогда дата может измениться при изменении часового пояса. Другими словами, не добавляйте информацию о времени в чистые даты.

PS: Следуя вашей ссылке, я был рад узнать, что я полностью согласен с заключительным замечанием этого ответа (кем-то с более высокой репутацией, чем я)




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему