63

我的服务器位于伦敦。

在我的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

4 回答 4

107

请参阅Django 文档的“使用”部分中的问题 #2 。

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

由于上面的文档还讨论了最佳实践,包括以下摘录:

如何获取当前时区的当地时间?

那么,第一个问题是,你真的需要吗?

您应该只在与人类交互时使用本地时间,并且模板层提供过滤器和标签以将日期时间转换为您选择的时区。

此外,Python 知道如何比较感知的日期时间,并在必要时考虑 UTC 偏移量。用 UTC 编写所有模型和视图代码要容易得多(并且可能更快)。因此,在大多数情况下,django.utils.timezone.now() 返回的 UTC 日期时间就足够了。

于 2013-04-16T12:36:50.713 回答
3
from django.utils import timezone
time = timezone.localtime() 

无论您的 TIME_ZONE 设置为什么,它都会为您提供当地时间。

time = timezone.localtime(timezone.now()) # same result, but it is redundant.
于 2020-08-07T08:45:31.090 回答
1

它在模板中起作用但在视图 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>)
于 2021-02-23T06:57:39.203 回答
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
于 2021-04-26T18:57:02.383 回答