Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Смещение часового пояса ASP.NET MVC

#c_sharp #net #aspnet_mvc #datetime


У меня есть сайт и сервер.
Хочу, чтобы клиентам из разных часовых поясов показывалось разное время.
Всю конвертацию провожу на сервере:

от клиента - 

return new DateTimeOffset(dateTime, TimeZoneInfo.Local.BaseUtcOffset);


клиенту - 

return ((DateTimeOffset)dateTime).LocalDateTime;


При тесте выяснил, что ASP.NET не умеет сам определять часовой пояс клиента, и его
надо определять с помощью JS и передавать при помощи кукис:

new Date().getTimezoneOffset();//gets the timezone offset


Вот тут время для вопроса. Каким образом прокидывать смещение от сайта до самого
сервера? Я хочу реализовать что-то наподобие

Thread.CurrentThread.CurrentUICulture = CultureInfo.***;


, без всяких хелперов и обёрток. Но раз в интернете я нигде не нашёл такого способа,
значит люди реализовывают смещение времени по другому. 
Как правильно поступить, если я хочу делать конвертацию смещения именно на сервере
и желательно стандартными средствами .NET?

UPD: схема такая: пользователь -> ASP.NET MVC 4 -> .exe служба на .NET -> SQL Server
    


Ответы

Ответ 1



Стандартного механизма нет по двум причинам. Первая из них - местным временем в .NET называют именно системное местное время, а не какое-то еще. А потому TimeZoneInfo.Local возвращает одно и то же для всех потоков и не может быть переопределено. Вторая - браузер не передает свой часовой пояс через заголовки HTTP (в отличии от языка, который передается в заголовке Accept-Language). Так что без хелперов и оберток не обойтись.

Ответ 2



Мы храним объект с разницей во времени между клиентом и сервером в сессии. Вернее, разницу между клиентским временем и UTC. B мастер-странице, при отсутствии этого объекта в сессии, вставляем вызов ajax-а, который отправляет getTimezoneOffset на сервер - в специальный контроллер, который создает объект и кладет его в сессию. Клиент - браузер. Сервер - компьютер с ASP.NET веб-приложением. Дату/время в базе данных следует хранить как UTC.

Комментариев нет:

Отправить комментарий