使用Django 1.6和PostGreSQL 9.2存储时区感知日期时间

时间:2016-03-16 11:36:03

标签: django postgresql time

TIME_ZONE = 'Europe/Paris' # UTC+1
USE_TZ = True

我只想让我的所有日​​期时间都在数据库中识别TZ ,但我不确定这样做的正确方法是什么,即使在阅读了django doc之后。

1)首先,我尝试到处使用timezone.now()。 如果在巴黎的时间是12:19,它将返回: datetime.datetime(2016, 3, 16, 11, 19, 51, 842247, tzinfo=<UTC>))

这似乎是正常的行为:Django将日期时间转换为UTC,但不确定它是否是一件好事。我在这个过程中没有丢失一些数据吗?如何通过这种方式知道数据与巴黎时区有关?

2)然后,我尝试到处使用localtime(timezone.now())。 这一次,如果在巴黎的时间是12:19,我会得到:datetime.datetime(2016, 3, 16, 12, 19, 37, 372710, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)

此处,不转换日期时间,并将实时时区信息(Paris)存储到日期时间。我认为是更好,但经过一些搜索,似乎没有人这样处理。我错过了什么吗?

另外,使用第二个解决方案,我真的希望我的对象存储在PostGreSQL数据库中,后缀为+01。一点也不。 以下是我的数据库时间戳的内容:2016-03-16 11:19:01.093176+00

我不明白如何以正确的方式做所有这些事情。

1 个答案:

答案 0 :(得分:3)

来自docs

  

当启用对时区的支持时,Django会存储日期时间   数据库中的UTC信息使用时区感知日期时间   内部对象,并将它们转换为最终用户的时区   模板和表格。

因此,当您在数据库中节省时间时,Django会自动将其存储在UTC中。当您在模板或表单中渲染时,Django会根据您的设置自动将其转换为用户的timeozone或默认时区(TIME_ZONE = 'Europe/Paris')。

这对Django 1.4及以上版本有效。

回答您的问题:

  

Django将日期时间转换为UTC,但不确定它是否是一件好事。

这是一件好事,因为它提供了一致性,您现在所有存储在数据库中的日期时间值都是UTC。因此,对于您必须考虑每个记录的时区的方法,任何时间或时区操作都会非常容易。

  

我在这个过程中没有丢失一些数据吗?如何知道这些数据   这种方式与巴黎时区有关吗?

为什么知道输入的时区时间对您来说很重要?不足以在所需时区显示时间(Django将自动执行此操作并将UTC转换为您的时区)。如果存储时区信息很重要,那么您需要将其存储在模型中单独的Char类型字段中。

  

此处,未转换日期时间和实时时区信息   (巴黎)存储在日期时间。我觉得还好,但是   在一些搜索之后,似乎没有人以这种方式处理。我错过了吗   什么?

再一次,当Django为你做这件事你为什么要自己做呢?这就是没有人这样做的原因。此外,最好将时间存储在标准UTC时间内,以便可以轻松转换为任何其他区域。