Часовой пояс клиента в ASP.NET - PullRequest
4 голосов
/ 28 ноября 2010

У меня есть таблица, которая должна отображать дату / время в часовом поясе клиента. Однако мне сложно найти способ сделать это эффективно. Я знаю, что могу использовать клиентский javascript для получения часового пояса (и этот метод немного ненадежный), но он мне нужен в событии Page_Load, поэтому я не могу вызвать javascript заранее.

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

Так что мне осталось несколько вариантов: 1. Иметь кеш на пользователя для последнего часового пояса, который я заполняю при каждой возможности от постбэка без гарантии, что это будет правильно)

  1. Попробуйте какой-нибудь странный взлом IP-геолокации

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

  3. Попробуйте сделать несколько перенаправленных страниц, чтобы вызвать обратную передачу (но некоторые браузеры отключают перенаправления страниц)

  4. Пользователь должен явно установить TZ

  5. Выполните форматирование tz в Javascript

Ничто из этого не является идеальным, мне кажется, информация, которую браузер должен предоставить серверу. У кого-нибудь есть другие предложения?

Ответы [ 7 ]

5 голосов
/ 28 ноября 2010

Если возможно, время отображения относительно . Вместо того, чтобы показывать определенное время, используйте прозу, например, «5 минут назад» или «На прошлой неделе».

Если вам необходимо отобразить абсолютное время в часовом поясе клиента, основываясь на ваших комментариях, я бы выбрал вариант № 5, отправив время UTC в браузер, а затем отобразив местное время с помощью JavaScript. Из вашего описания звучит так, что пользователи могут посещать страницы, на которых необходимо отображать время в своем часовом поясе, не входя в систему, поэтому сохранение его в профиле пользователя кажется неадекватным.

Я более подробно рассмотрю концепцию отображения относительного времени в Советы по сохранению и отображению дат и времени в разных часовых поясах , а также предоставлю простой метод расширения структуры DateTime для добавления ToRelativeDateString метод, так что вы можете написать код как:

string relativeTime = myDateTimeVariable.ToRelativeDateString();

Надеюсь, это поможет ...

0 голосов
/ 29 декабря 2010

Я бы согласился со Скоттом Майклом.Отобразите относительное время, если вам нужно абсолютное время, когда ваш браузер уже знает, как их локализовать из UTC.

Но если вы ищете надежное определение часовых поясов с помощью JavaScript (для использования на стороне сервера);проверить jsTimezoneDetect .Он даст вам ключ часового пояса Олсена, который вы можете использовать с нормализацией даты и времени на стороне сервера.

0 голосов
/ 28 ноября 2010

Я думал, что дам вам обновление. Я принимал различные предложения по форматированию даты на стороне клиента (или, точнее, переформатировал ее). Как гугл-фураж, я поместил полное объяснение этого в конце этого поста.

Однако проблема в том, что Date.toLocaleString не принимает параметров для управления форматированием, и поэтому, в любом случае, в моей локали в США я получаю большую громоздкую строку "Суббота, 27 ноября 2010 г. 15:58:38 PM" Это Это слишком громоздко, я хочу компактный формат, как Сб 27/27/10 15:58 ", но нет способа контролировать его AFAIK.

Так что я собираюсь изменить, чтобы попытаться кэшировать часовой пояс в сеансе на основе ввода с различных ключевых страниц, публикующих смещение часового пояса, и включить возможность изменять tz в профиле пользователя. Это не приятно, но это лучшее, что я могу придумать. Как я уже сказал, это действительно должно быть включено в заголовки http браузера.

----- Форматирование на стороне клиента ------------

Итак, у меня есть такие ярлыки (в ListView FWIW):

<asp:Label ID="TimeLabel" runat="server" class="UTCTimeCell Hidden">
    <%# Eval("when") %> UTC
</asp:Label>

Обратите внимание, что вы должны включить UTC для часового пояса, поскольку форматировщик ASP.NET по умолчанию его не включает. (Здесь я предполагаю, что вы сохраняете свои даты как UTC, что почти во всех случаях следует.) Примечание Скрытый - это стандартный класс css, который я использовал с display: none.

Затем я определяю следующие функции в моем утилите javascript (очевидно, я использую jQuery ...)

function timeFormatLocal(timeStr) {
    var dt = new Date(timeStr);
    return dt.toLocaleString();
}

function timeReformatLocal(selector) {
    $(selector).each(function () {
        $(this).html(timeFormatLocal($(this).html()));
    });
}

тогда на моей странице готового события я использую что-то вроде этого:

timeReformatLocal(".UTCTimeCell");
$(".UTCTimeCell").removeClass("Hidden");

Это переформатирует эти ячейки меток в формат на основе локали.

0 голосов
/ 28 ноября 2010

Просто выведите все время в UTC, а затем преобразуйте в местное время на стороне клиента.

0 голосов
/ 28 ноября 2010

5, 2, 3, 4, 1, вероятно, лучший порядок ваших вариантов.

0 голосов
/ 28 ноября 2010

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

0 голосов
/ 28 ноября 2010

Я бы использовал смешанную стратегию:

  1. Пользователи могут устанавливать часовой пояс в своих профилях
  2. По умолчанию установлено «auto», что означает: форматировать с помощью JavaScript
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...