Django Timezone如何运作?

时间:2015-09-26 08:55:31

标签: python django datetime timezone

所以,在我的设置中,我有以下内容:

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

2 个答案:

答案 0 :(得分:2)

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

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

所以你描述的一切都是设计的。它真的会给你带来麻烦吗?

答案 1 :(得分:1)

  1. 是的,它从运行代码的机器获取信息。
  2. 不,它没有给你当地时间。不,它不会使用您设置的时区(doc refcode ref)。它使用UTC时间(Europe/Copenhagen是UTC + 2)。
  3. 如果你想获得本地日期时间对象,你应该让它变得幼稚:

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