2012-02-26 2 views
9

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

timestamp = models.DateTimeField() 

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

ответ

11

Ни 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 недель при изменении летнего времени смещение отличается. Кроме того, в некоторые времена года у кого-то в Квинсленде и у кого-то в Новом Южном Уэльсе есть одинаковое смещение по GMT, но из-за того, что NSW не имеет DST и Квинсленд, в течение половины года их разницы в GMT отличаются. Единственный безопасный способ перечислить часовые пояса - это список фактических географических часовых поясов.

+0

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

4

То, как я это делаю, использует имена переменных времени 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 
    .... 

Примечание я поставил пустой & нуль to 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.

0

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

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') 
# ... 
Смежные вопросы