сохранить часовой пояс в моделях Django - PullRequest
16 голосов
/ 26 февраля 2012

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

 timestamp = models.DateTimeField()

Раскрывающийся список должен иметь вид: ... GMT +5: 30 GMT +6: 00 ... и так далее.

Ответы [ 4 ]

19 голосов
/ 26 февраля 2012

Ни django, ни python не предоставляют набор часовых поясов для использования.

Для этого вам понадобится дополнительный модуль, такой как pytz.Вы можете получить список всех часовых поясов, таких как:

>>> import pytz
>>> pytz.all_timezones ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara',
'Africa/Asmera'....

Вы можете сохранить название часового пояса в виде CharField.

Кстати, выбрав часовой пояс по "GMT +6:00 "не очень хорошая идея.Например, EST обычно на 5 часов отстает от GMT, но в течение 2 недель при изменении летнего времени смещение отличается.Кроме того, в некоторые времена года кто-то в Квинсленде и кто-то в Новом Южном Уэльсе имеют одинаковое смещение по Гринвичу, но из-за того, что в Новом Южном Уэльсе есть летнее время, а в Квинсленде нет, в течение полугода их смещения по Гринвичу различаются.Единственный безопасный способ составления списка часовых поясов - это перечисление фактических географических часовых поясов.

10 голосов
/ 26 августа 2013

django-timezone-field - приложение, которое прекрасно справляется с этим.

6 голосов
/ 29 апреля 2014

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

TIMEZONES = (
    'Canada/Atlantic',
    'Canada/Central',
    'Canada/Eastern',
    'Canada/Mountain',
    'Canada/Pacific',
)

Затем у меня есть класс местоположения, который устанавливает часовой пояс в виде поля Char следующим образом:

class Location(models.Model):
    ....
    time_zone = models.CharField(max_length=100, blank=True, null=True, choices=TIMEZONES)  # 64 min
    ....

Уведомление Iустановите пустое & null в True, чтобы сделать поле необязательным.Посмотрите на django-timezone-field fields.py для дальнейших идей.

Чтобы использовать это в моем коде с pytz, я импортирую часовой пояс:

from pytz import timezone
import datetime
from locations.models import Location # my object that has the time_zone field
loc = Location.objects.get(pk=1)  #get existing location or your object that has time_zone field
utc = pytz.utc
some_utc_date = datetime.datetime(2002, 10, 27, 6, 0, 0).replace(tzinfo=utc) #tz aware
some_date.astimezone(timezone(loc.time_zone))

Замените datetime.datetime (2002, 10, 27, 6, 0, 0) на поле даты и времени, соответствующее вашему местоположению или конкретному объекту с полем time_zone.В моем случае я храню все свои поля даты в формате UTC в коллекции MongoDB.Когда я получаю данные и хочу создать удобочитаемый вывод, я использую описанный выше метод для отображения даты в выводе.Вы также можете создать собственный тег для обработки этого в шаблонах.Подробнее см. pytz doc.

4 голосов
/ 24 августа 2017

Я думаю, что все приведенные выше ответы верны, но я оставляю свои здесь в качестве простого примера ...

class UserProfile(models.Model):  

    import pytz
    TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones))

    # ...
    timezone = models.CharField(max_length=32, choices=TIMEZONES, 
    default='UTC')
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...