2015-10-16 7 views
3

Django начинающий здесь.Confused by django поддержка часового пояса

В официальной документации:

# Support for time zones is enabled in the default settings file, so 
# Django expects a datetime with tzinfo for pub_date. Use timezone.now() 
# instead of datetime.datetime.now() and it will do the right thing. 
>>> from django.utils import timezone 
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) 

Попытка сделать его воспроизвести в ./manage.py оболочки:

In [35]: from django.conf import settings 

In [36]: settings.USE_TZ 
Out[36]: True 

In [37]: settings.TIME_ZONE 
Out[37]: 'Europe/Moscow' 

In [38]: from django.utils import timezone 

    # UTC 
In [39]: timezone.now() 
Out[39]: datetime.datetime(2015, 10, 16, 9, 47, 50, 755418, tzinfo=<UTC>) 

    # Actual time 
In [40]: timezone.datetime.now() 
Out[40]: datetime.datetime(2015, 10, 16, 12, 47, 54, 554197) 

    # UTC 
In [41]: timezone.activate("Europe/Moscow"); timezone.now() 
Out[41]: datetime.datetime(2015, 10, 16, 9, 47, 59, 405269, tzinfo=<UTC>) 

    # Actual time 
In [42]: timezone.activate("Europe/Moscow"); timezone.datetime.now() 
Out[42]: datetime.datetime(2015, 10, 16, 12, 48, 3, 179085) 

Когда я бегу timezone.now(), как указано в документации, я получаю UTC что неправильно. Когда я запускаю timezone.datetime.now() (то, что я думаю, просто звонит datetime.datetime.now(), который использует общесистемный часовой пояс). Я получаю правильную вещь.

Пробовал с различными часовыми поясами, все еще получая простой UTC.

Что я делаю неправильно?

ответ

1

timezone.now() ведет себя как следует: если USE_TZ=True; он возвращает текущее время как известный объект datetime (в UTC).

2015-10-16 09:47:50+00:00 (UTC) - тот же момент времени, что и у 2015-10-16 12:47:50+03:00 (MSK). Время UTC отображается в шаблонах с использованием текущего часового пояса (по умолчанию установлено значение TIME_ZONE, поэтому нет необходимости его явно устанавливать с помощью timezone.activate() здесь).

Вы можете получить значение явно с помощью timezone.localtime(timezone.now()) (вам не нужно).

+0

Странно, я думал, что настройка settings.USE_TZ предназначена для автоматического преобразования в TIME_ZONE. Итак, если я правильно понимаю, USE_TZ = True каким-то образом предоставляет средства для «введения» информации о часовом поясе в объект timezone.now(). Я прав? – mkurnikov

+2

@mkurnikov: это не странно: [лучшая практика] (http://stackoverflow.com/a/2532962/4279): используйте UTC везде, конвертируйте в локальное время для отображения: это именно то, что делает django. Чтобы понять, почему вы предпочитаете иметь дело с UTC, если это возможно, рассмотрите, например, как бы вы [находите, прошло ли 24 часа между датами] (http://stackoverflow.com/a/26313848/4279) – jfs

+0

Хорошо, теперь я Понимаю. Спасибо за ответ. – mkurnikov

Смежные вопросы