django的timezone.now没有显示正确的时间

时间:2013-04-16 12:25:23

标签: django django-timezone

我的服务器在伦敦。

settings.py我有:

TIME_ZONE = 'Europe/Moscow'
USE_TZ = True

但是当我这样做时:

from django.utils import timezone

print timezone.now().hour

它打印伦敦的时间。我做错了什么?

更新

>> timezone.now()
datetime.datetime(2013, 4, 16, 12, 28, 52, 797923, tzinfo=<UTC>)

tzinfo = <UTC>,所以也许它打印的不是伦敦时间,而是UTC的+0时间?无论如何,如何让django展示莫斯科的时间?

此外,当我使用now = timezone.now()渲染模板时。

{{ now.hour }}打印,例如,12(伦敦时间)

{{ now|date:"G" }}打印16(莫斯科时间)

4 个答案:

答案 0 :(得分:70)

请参阅"Usage" section of the Django docs中的问题#2。

>>> from django.utils import timezone
>>> timezone.localtime(timezone.now())

答案 1 :(得分:1)

from django.utils import timezone
time = timezone.localtime() 

它将为您提供本地时间,无论您的TIME_ZONE设置为什么。

time = timezone.localtime(timezone.now()) # same result, but it is redundant.

答案 2 :(得分:0)

它在模板中工作但不在视图中的原因python代码有点在文档中: https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-TIME_ZONE

“..... 这是 Django 用于在模板中显示日期时间和解释在表单中输入的日期时间的默认时区。”

这就是为什么 {{ now|date:"G" }} 打印 16(莫斯科时间)打印莫斯科时间!

另一个注意事项是 timezone.now() 在正常配置的 Django 应用程序中会选择设置中设置的任何 TIME_ZONE(在下面的示例中为“America/New_York”)。但也可以被覆盖(参见下面的巴黎,例如在中间件中或直接在该请求的视图中)

In [27]: timezone.localtime(timezone.now())

Out[27]: datetime.datetime(2021, 2, 23, 1, 53, 49, 793743, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)

In [29]: timezone.activate(pytz.timezone("Europe/Paris"))

In [30]: timezone.localtime(timezone.now())

Out[30]: datetime.datetime(2021, 2, 23, 7, 54, 19, 21898, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)

答案 3 :(得分:0)

django 的 use_tz = True 返回时区中的日期时间对象。如果设置为 false,它将使用系统默认(区域设置)时间,这是天真的。 我做了一个小实验来澄清这个困惑

test1:当 use_tz = true;时区=美国/东部;系统时区:UTC+5:30

datetime.datetime.today() # returned naive datetime with locale time
timezone.now() returned # UTC
timezone.localtime() # returned us/eastern 

test2:当 use_tz = true;时区=美国/东部;系统时区:UTC-5

datetime.datetime.today() # returned naive datetime in with locale time
timezone.now() # returned UTC timezone
timezone.localtime() # in US/eastern timezone

test3:当 use_tz = False;时区=美国/东部;系统时区:UTC-5

timezone.now() # returned naive datetime with system time
timezone.localtime() # returned traceback ValueError: localtime() cannot be applied to a naive datetime

test4:当 use_tz = False;时区 = UTC;系统时区:UTC+5:30

datetime.datetime.today() # returned naive datetime in system timezone
timezone.now() # returned naive datetime in system timezone
timezone.localtime() # returned traceback