/ / Робота з декількома часовими поясами в Django - python, django, internacionalization, django-timezone

Робота з декількома часовими поясами в Django - python, django, інтернаціоналізація, django-timezone

Додаток, над яким я працюю, є цільовими користувачами США. І (як ви знаєте) у США існує більше одного часового поясу. Тож у мене є сумніви:

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

Це для API, щоб захопити часовий пояс користувача через JS - це не варіант. Я отримую поточного користувача через TokenAuthentication.

Відповіді:

1 для відповіді № 1

Використовуйте UTC за settings.py та схопіть їх зміщення часового поясу з Javascript:

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

напр. для Лос-Анджелеса прямо зараз utcOffset == -7

На жаль, це не враховує літній час пізніше (зміщення змінено на -8), тож вам, можливо, доведеться розібратися в цьому під час пошуку, щоб отримати Pacific/Los_Angeles. В іншому випадку ви завжди можете просто запитати користувача у формі реєстрації, якщо це важливо для вашого бізнесу.

EDIT: Оскільки ви використовуєте API, ви також можете спробувати використовувати IPInfoDB API для геолокації на основі IP-адреси клієнта. Це не завжди абсолютно точно, але майже завжди достатньо, щоб отримати правильний часовий пояс.


0 для відповіді № 2

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

from django.utils import timezone

now = timezone.now()

Джанго з’ясує, в якому часовому поясі ви знаходитесь, і порівняє їх відповідно.

user.event.created > timezone.now()

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


0 для відповіді № 3

Рішення полягає в тому, щоб завжди зберігати часові позначки unix в базі даних. Ви можете генерувати за допомогою time.time() . Це означає, що ваша модель повинна мати Floatfield (або навіть BigIntegerField залежно від необхідної точності).

Ваш шаблон повинен відображати числове значення таким, яким воно є. Тоді вам знадобиться крихітний javascript для перетворення цієї часової позначки Unix у час дати.

new Date(unix_timestamp);