2015-09-03 3 views
3

Приложение, в котором я работаю, имеет в качестве целевых пользователей США. И (как вы знаете) в США существует более одного часового пояса. Поэтому у меня есть некоторые сомнения:Работа с несколькими часовыми поясами в Django

  • так как я могу получить текущее время на стороне сервера в зависимости от текущего пользователя ?
  • И как я могу хранить DateTime данных, чтобы показать правильное время для каждого пользователя?
  • Как я могу сравнить времена (пример: user.event.created > datetime.now())? Какой часовой пояс будет использовать .now()?
  • Какой TIME_ZONE я должен установить в файле settings.py.

Это API для захвата пользовательского часового пояса через JS не является вариантом. Я получаю текущего пользователя через TokenAuthentication.

ответ

1

UTC Используйте для settings.py и захватить их смещение часового пояса от Javascript:

var utcOffset = -((new Date()).getTimezoneOffset())/60; 

например в Лос-Анджелесе сейчас utcOffset == -7

К сожалению, это не учитывает летнее время изменения позднее (смещение изменения в -8), так что вы, возможно, придется выяснить, что на момент поиска, чтобы получить Pacific/Los_Angeles. В противном случае вы всегда можете просто спросить пользователя в форме регистрации, если это важно для вашего бизнеса.

EDIT: Поскольку вы используете API, вы также можете попробовать использовать IPInfoDB API для геолокации на основе IP-адреса клиента. Это не всегда полностью точно, но почти всегда достаточно, чтобы получить правильный часовой пояс.

+0

Спасибо за ваш ответ, возможно, мне придется попросить пользователя. Я должен был указать, что я работаю в API, поэтому я не могу использовать JS для получения часового пояса пользователя. – Gocht

+0

@ Gocht Я отредактировал свой ответ с другим возможным решением, так как вы используете API. –

+0

Итак, вы рекомендуете хранить часовой пояс пользователя? или получить его каждый раз, когда пользователь получает доступ к API. Я отредактировал вопрос еще одним сомнением. – Gocht

0

Не используйте функцию datetime.now(), вместо этого используйте функцию now() в модуле часового пояса.

from django.utils import timezone 

now = timezone.now() 

Django выяснит, в каком часовом поясе вы находитесь, и сравните их соответственно.

user.event.created > timezone.now() 

https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/

+0

Я думаю 'timezone.now()' получить часовой пояс в файле 'settings.py'. Но в некоторых случаях у пользователя будет другой часовой пояс. – Gocht

+0

по умолчанию он использует часовой пояс в настройке, но если у вас есть пользовательский часовой пояс, вы можете активировать timezone.activate (pytz.timezone (tzname)). Посмотрите на TimezoneMiddleware по ссылке выше. –

0

Решение всегда хранить временные метки UNIX в базе данных. Вы можете создать с помощью time.time(). Это означает, что ваша модель должна иметь Floatfield (или даже BigIntegerField в зависимости от необходимой точности).

Ваш шаблон должен отображать числовое значение как есть. Тогда вам понадобится крошечный бит javascript для преобразования этой временной метки unix в дату.

new Date(unix_timestamp); 
Смежные вопросы