Django的时区是如何工作的



那么,在我的设置中,我有如下设置:

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()是否从服务器获取信息?

  1. 是的,它从运行代码的机器获取信息。不,它没有给你当地时间。不,它不使用时区从你的设置(doc ref, code ref)。使用UTC时间(Europe/Copenhagen为UTC+2)。
  2. 如果你想获得本地datetime对象,你应该让它朴素:

    timezone.make_naive(timezone.now(), timezone.get_current_timezone())  
    

关于时区感知的日期时间,重要的不是它们恰好存储在哪个时区,而是它们表示单个时间点。当它为真时,用您想要的任何时区显示日期时间都是微不足道的(好吧,可能,无论如何)。

所以Django的工作方式是所有感知的日期时间都存储在UTC中。(即便如此,它们也可能以UTC格式从数据库返回,也可能不返回,这取决于数据库的设置。)然后它为你提供了工具(例如TIME_ZONE设置和activate())来设置在呈现模板供用户显示时应该使用的时区。

所以你所描述的一切都是经过设计的

相关内容

  • 没有找到相关文章

最新更新