Razbezhkin
@Razbezhkin
программист, преподаватель

Как учитывать часовой пояс пользователя на asp.net сайте?

Здравствуйте!
Есть старый и большой проект на asp.net mvc. В сотнях контроллерах и представлениях для определения или вывода на страницу текущего времени использовалась конструкция @DateTime.Now, которая, разумеется, выводила текущее время сервера. Теперь хочется учитывать часовой пояс пользователя (который записан у него в профиле).
Я вижу долгий и трудоемкий путь к этой цели (который меня пугает своими размерами):
- во всех местах, где я записываю в БД текущую дату использовать DateTime.UtcNow
- во всех местах, где я вывожу текущую дату пользователя переводить ее из мирового в локальное время
- все старые даты во всех записях БД перевести из местного времени в мировое
- логику сервисов переписать с учетом того времени, которое для него логично
в общем придется сильно вникать в каждую строку кода и, скорее всего, будут ошибки %(

Может быть есть подходы, которые облегчат задачу? например, как-нибудь перегрузить метод DateTime.Now, чтобы он возвращал мировое время или как-то настроить контекст (сессию) пользователя так, чтобы там было его местное (отличное от серверного) время.

Спасибо за ваше внимание и советы
  • Вопрос задан
  • 986 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
DateTime.Now - просто сделать поиск и замену (по файлам). Можно ограничить поиск типами файлов (.cs, .cshtml, .aspx, .ascx), чтобы не зацепить лишнего.

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

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

В представлениях делать вывод даты и времени можно в какие-нибудь span-ы, например:
<p>
  <span class="datetime">
    @Html.GetDateTime(DateTime.Now)
  </span>
</p>
<p>
  <span class="datetime" data-timestamp="@Html.GetTimestamp()">
    @Html.GetDateTime(DateTime.Now)
  </span>
</p>

<p>Метод <b>Html.GetDateTime</b> вполне может возвращать дату в тегах, тогда будет:</p>
<p>@Html.GetDateTime(DateTime.Now)</p>
<p>а на выходе может быть:<p>
<p>
  <span class="datetime" data-timestamp="123">
    15.11.2016 21:11:21
  </span>
</p>
<p>
  <b>timestamp</b> - позволит обойти проблему с форматированием, 
  при расчете времени на стороне клиента.
</p>

С UTC будет проще работать, но вполне можно конвертировать время из времени сервера, главное не затеряться во времени, особенно между зимой и летом :-)

С представлениями придется повозиться. Хотя если у вас имена полей, содержащие дату и время, более ли менее унифицированы, то проблем особых быть не должно.

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

В коде (C#) с заменой особых проблем быть не должно.

Замену в базе, при необходимости, можно автоматизировать. Единственное, если используется где-то GETDATE(), могут быть проблемы, тоже придется учитывать.

Попробуйте для начала с представлениями (выводом) разобраться.
А стоит проводить (в коде и базе) крупномасштабную замену времени сервера на UTC - время покажет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы