Быстро и грязно : Вы можете избежать этой проблемы, попросив пользователя сообщить, через сколько часов / минут должно произойти событие. Тогда не имеет значения, какой у них часовой пояс.
Лучше : если у вас есть возможность узнать местное время по телефону, а также время UTC (с телефона или с вашего сервера), это сообщит вам Смещение UTC телефона. Вы можете сойти с рук большую часть времени. Но смещение UTC - это НЕ то же самое, что местный часовой пояс. Ближе к границе летнего или летнего времени идеи, такие как «то же самое время завтра», ломаются, если предположить, что смещение UTC совпадает с часовым поясом.
Best : для правильной поддержки политик часовых поясов ничто не может заменить базу данных Olson . Использование Olson подразумевает, что в вашем приложении есть элемент конфигурации, позволяющий пользователю установить свой часовой пояс (примеры: America/New_York
и Etc/UTC
). Вы можете выбрать значения по умолчанию для этого, основываясь на смещении UTC телефона и номера мобильного телефона (используя таблицы поиска, как подробно описано в других ответах), и большую часть времени будете корректны.
В Python модуль pytz
предоставляет вам очень чистый API для использования базы данных Olson для работы с datetime
объектами.
EDIT: эта функция преобразует время Unix в локализованный объект datetime
, учитывая объект часового пояса:
def localize_epoch_time(epoch_time, timezone=pytz.UTC):
u"Given an epoch time return an accurate, timezone-aware datetime object"
t = localtime(epoch_time)
epochdt = datetime(*(t[:6] + (int((epoch_time - long(epoch_time)) * 1000000), timezone)
if hasattr(timezone, 'normalize'): # pytz tzinfo objects have this
return timezone.normalize(epochdt)
else: # tzinfo object not from pytz module
return epochdt