Преобразование даты в utc с использованием часового пояса, переданного от клиента (JavaScript) - PullRequest
0 голосов
/ 24 мая 2018

У меня есть логика для отображения сообщения на экране пользователя в течение определенного времени, указанного администратором.

var time = DateTime.SpecifyKind(System.DateTime.Now, DateTimeKind.Unspecified);
var date= TimeZoneInfo.ConvertTimeToUtc(time, TimeZoneInfo.FindSystemTimeZoneById(System.TimeZoneInfo.Local.Id));
StringBuilder dispalyMessage = new StringBuilder("<marquee scrolldelay='90' behavior='scroll' scrollamount='1' direction='left'><b><ul>");
var bannerMessageIds = new HashSet<int>(db.CompanyBanners.Where(c => c.CompanyId == PortalUser.Current.CurrentCompanyId).Select(x => x.BannerMessageId));
List<BannerMessage> bannerMessages = db.BannerMessages.Where(p => bannerMessageIds.Contains(p.Id)  && (p.StartDate < date && p.EndDate > date) ).ToList();

Здесь проблема в том, что я конвертирую время для проверки с использованием часового пояса сервера.

Есть ли способ передать часовой пояс клиента из javascript в c # и преобразовать дату в соответствии с этим часовым поясом.

Я имею в виду что-то вроде этого

var date= TimeZoneInfo.ConvertTimeToUtc(time, TimeZoneInfo.FindSystemTimeZoneById("time zone id passed from client javascript"));

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

На стороне клиента

  Create a script that will be executed at every time the page loads.
    In the script check if the cookie that stores timezone offset exists.
    If the cookie not exists check whether the browser supports cookie.
    If the browser supports cookie create a new one and store the timezone offset.
    Reload the page if the cookie is created for the first time or expired.
    If the timezone cookie already exists check if the current timezone and the one stored in cookie are same. 
If they are different then overwrite with new timezone and reload the page.

На стороне сервера

    Read the cookie value on every request and store it in session.
    Create a utility method that converts the passed datetime in UTC to the client timezone by adjusting it with the offset read from session.
  If there is no value in session possibly the browser doesn’t supports cookie then convert the date-time to server timezone.

Смотрите здесь для полной имплантациии еще подсказки

0 голосов
/ 24 мая 2018

Если вы храните дату и время в базе данных в формате UTC, вам все равно.Так что, если я что-то пропустил (всегда возможно :)), не могли бы вы просто запросить значение DateTime.UtcNow и не выполнить преобразование часового пояса в этой части?

например, часовой пояс пользователя, сейчас 13:00.Часовой пояс сервера, это 10:00.Время UTC - 09:00.

Когда вы сохраняете время в базе данных, вы конвертируете введенные дату / время из часового пояса пользователя в UTC (либо в JavaScript, либо на стороне сервера), поэтому пользователь вводитвремя 13:00 сохраняется в UTC как 09:00.

Когда пользователь попадает на страницу, вы хотите найти все сообщения, которые должны отображаться «сейчас».«Сейчас» для пользователя 13:00, а в UTC - 09:00.Поэтому поиск, основанный на времени UTC, должен быть всем, что нужно.

0 голосов
/ 24 мая 2018

Я думаю, что нет.но вы можете получить смещение часового пояса в JavaScript, как показано ниже.

function myFunction() {
var d = new Date();
var n = d.getTimezoneOffset();
document.getElementById("demo").innerHTML = n;
}

Это должно служить вашей цели.

...