那么,在我的设置中,我有如下设置:
LANGUAGE_CODE = 'en-us'
USE_I18N = True
USE_L10N = True
USE_TZ = True
TIME_ZONE = 'Europe/Copenhagen'
然而,当我发出:
timezone.now()
datetime.datetime(2015, 9, 26, 8, 47, 15, 862729, tzinfo=<UTC>)
时间晚了两个小时。
我正在阅读文档,我可以看到这个方法调用datetime.datetime(),那里的信息是正确的。我可以看到输出是基于变量TIME_ZONE的,它被设置为我的当前位置。那么timezone.now()不应该得到正确的TIME_ZONE时间吗?
另一个问题:datetime.datetime()是否从服务器获取信息?
- 是的,它从运行代码的机器获取信息。不,它没有给你当地时间。不,它不使用时区从你的设置(doc ref, code ref)。使用UTC时间(
Europe/Copenhagen
为UTC+2)。 -
如果你想获得本地datetime对象,你应该让它朴素:
timezone.make_naive(timezone.now(), timezone.get_current_timezone())
关于时区感知的日期时间,重要的不是它们恰好存储在哪个时区,而是它们表示单个时间点。当它为真时,用您想要的任何时区显示日期时间都是微不足道的(好吧,可能,无论如何)。
所以Django的工作方式是所有感知的日期时间都存储在UTC中。(即便如此,它们也可能以UTC格式从数据库返回,也可能不返回,这取决于数据库的设置。)然后它为你提供了工具(例如TIME_ZONE
设置和activate()
)来设置在呈现模板供用户显示时应该使用的时区。
所以你所描述的一切都是经过设计的