Как выяснить, в каком часовом поясе находится пользователь веб-сайта (ASP.NET / MonoRail)?

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

Итак, мне нужно выяснить часовой пояс пользователя на стороне сервера.

Есть ли способ сделать это в BCL? Например, что-то вроде того, чтобы полагаться на правильность установки CultureInfo.CurrentUICulture (что я считаю, что MonoRail LocalizationFilter делает, но еще не проверил должным образом), а затем выяснить, в каком часовом поясе находится пользователь (а также учесть переход на летнее время). там тоже) на основании чего?

В .NET 3.5 есть System.TimeZoneInfo, но мало документации о том, что такое идентификаторы - будь то коды ISO или что.

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

Хм. Я только что посмотрел на code.google.com/p/gears/wiki/GeolocationAPI , и он может вернуть хотя бы код страны. Почти то, что я хочу ...
Peter Mounce 12.12.2008 10:33:25
К вашему сведению, время куки в GMT. Поэтому, если вы установите их на сервере, срок его действия истечет, когда он должен, при условии, что клиент не изменил свой часовой пояс на какое-то странное значение. Тем не менее, даже если они имеют, он все равно истекает в течение 24 часов, если у них не установлена ​​совершенно неправильная дата.
Robert C. Barth 15.12.2008 18:00:56
3 ОТВЕТА

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

Я бы сказал, что было бы лучше сделать это на стороне клиента.

0
10.12.2008 12:08:21

Это очень просто. На сервере поставьте поле asp: hidden и заполните его текущей датой / временем сервера. На клиенте вычтите дату / время в скрытом поле из текущей даты на клиенте (новая Дата ()), и у вас будет смещение от GMT. Обратный для выполнения этого на сервере (например, новый Date () в скрытом поле, вычесть время сервера из значения скрытого поля).

1
10.12.2008 21:45:32
Это не работает, когда учитывается переход на летнее время. Не везде соблюдается ТЛЧ, и в мире существуют разные правила (из того, что я помню)
Dan Herbert 12.12.2008 02:59:16
А? Конечно, это работает. Вы получаете текущее смещение, чтобы сделать текущий сдвиг времени. Это всегда будет работать. Я не говорю, чтобы сохранить смещение в долговременном хранилище, просто используйте его в качестве значения для этого запроса страницы. Я хорошо знаю о DST, поскольку состояние, в котором я живу, не делает DST.
Robert C. Barth 15.12.2008 17:58:27

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

Лучший вариант - позволить пользователю самостоятельно устанавливать часовой пояс через своего рода панель управления. Таким образом, вы точно знаете, в каком часовом поясе находится пользователь, и позволяете ему подтвердить часовой пояс.

Предполагается, что в будущем в браузеры будут добавлены некоторые замечательные функции геолокации, но до производства еще далеко.

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

http://www.attackwork.com/BlogEntry/3/Time-zone-detect-and-ignore-Daylight-Saving-Time-DST/Default.aspx http://www.attackwork.com/BlogEntry/11/Daylight -Сохранение-Time-DST-Detect / Default.aspx

Все еще не очень хорошая идея, но она работает.

1
12.12.2008 03:08:31