Часовые пояса и локализация - PullRequest
1 голос
/ 10 ноября 2011

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

Проблема возникает при переводе объектов date и datetime в строки в моих шаблонах и при принятии пользовательского ввода. 18:00 UTC не очень много значит для тех, кто находится в PST. Аналогичным образом, запрос пользователей на ввод времени в UTC требует катастрофы.

Как правильно перевести эти значения разумным, не подверженным ошибкам способом? Есть ли способ определить по HTTP-запросу, в каком часовом поясе находится пользователь? Мне действительно нужен способ определить часовой пояс пользователя с минимальными усилиями, насколько это возможно.

Ответы [ 5 ]

1 голос
/ 11 ноября 2011

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

Даже помимо этого, некоторые неграмотные пользователи (т.е. бабушка) могут не знать, как установить часовой пояс своей локальной системы; или пользователи в туннельных сеансах или виртуальных машинах могут иметь «локальный» часовой пояс, который не установлен для их фактического предпочтения.

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

Моя рекомендация будет конкретно:

  • Включить часовой пояс Олсона как часть любого профиля пользователя. Часовые пояса можно искать по стране, и это должно сделать выбор пользователя часового пояса относительно безболезненным. Дайте 0,01% пользователей, которым небезразличен выбор прямого UTC: -)
  • Если вы заполните в профиле пользователя значение по умолчанию, основанное на IP-адресе, большую часть времени вы будете правы, если воспользуетесь хорошим сервисом поиска. Но позвольте пользователю изменить это, если это неправильно.
  • Для анонимных пользователей предоставьте какой-нибудь виджет на любой странице, который отображает или вводит местное время, что позволяет им выбирать часовой пояс Олсона почти так же, как для профиля пользователя. Сохраните выбранное ими значение в файле cookie. По умолчанию UTC или предполагаемое значение, как указано выше.

При реализации веб-приложения, которое ранее требовалось для отображения меток времени в локализованном времени, я обнаружил, что не все клиенты корректно переводят UTC в местное время для прошлых и будущих дат. Я должен был выполнить все преобразования на стороне сервера. Для этого может потребоваться веб-служба, которая использует местное время и часовой пояс Олсона и возвращает время UTC.

1 голос
/ 10 ноября 2011

Я сделал это так. Вам может понадобиться easy_install pytz для объектов часового пояса.

import pytz
import time
import datetime
d = time.time()

print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Eastern'))
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Central'))
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Mountain'))
print datetime.datetime.fromtimestamp(d, pytz.timezone('US/Pacific'))

Здесь переменная d хранит время UTC как метку времени Unix.

0 голосов
/ 10 ноября 2011

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

Например, дата для UTC для отправки на сервер:

(new Date("November 11, 2011 23:13:42")).toUTCString()

ИUTC по местному времени, для рендеринга:

(new Date("October 17, 1986 15:29:13 UTC")).toLocaleString()
0 голосов
/ 10 ноября 2011

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

0 голосов
/ 10 ноября 2011

Вы не можете надежно получить часовой пояс пользователя из заголовков запросов.Вот почему большинство веб-сайтов просят пользователей установить часовой пояс в настройках профиля.Тем не менее, вы можете использовать различные приемы, чтобы попытаться получить.Одна хитрость заключается в том, чтобы использовать API-адрес Google для определения местоположения, чтобы узнать, откуда приходит пользователь, а затем попытаться угадать часовой пояс из географического местоположения.Это также не на 100% надежно, но приблизит вас к истине.

только что понял, что об этом уже спрашивали хотя бы один раз: получить часовой пояс пользователя

...