TIME_ZONE = 'Europe/Paris' # UTC+1
USE_TZ = True
我只想在数据库 中拥有我所有的日期时间 TZ-aware ,但我不确定什么是正确的方法,即使在阅读了 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>)
在这里,日期时间没有转换,实际时区信息(巴黎)被存储到日期时间中。我认为是更好,但经过一番搜索,似乎没有人以这种方式处理。我错过了什么吗?
另外,使用第二个解决方案,我真的希望我的对象以
+01
后缀存储在 PostGreSQL 数据库中。一点也不。这是我的数据库时间戳的内容:
2016-03-16 11:19:01.093176+00
我不明白如何以正确的方式做所有这些事情。
最佳答案
来自 docs
因此,当您在数据库中保存时间时,Django 会自动将时间存储在 UTC 中。当您在模板或表单中呈现此时间时,Django 会根据您的设置自动将其转换为用户的时区或默认时区 ( TIME_ZONE = 'Europe/Paris'
)。
这对 Django 1.4 及以上版本有效。
回答您的问题:
这是一件好事,因为它提供了一致性,您现在存储在数据库中的所有日期时间值都采用 UTC。因此,对于必须为每个记录考虑时区的方法,任何时间或时区操作都将非常容易。
为什么知道输入的时区时间对您很重要?以所需时区显示时间是否足够(Django 会自动执行此操作并从 UTC 转换为您的时区)。如果存储时区信息很重要,那么您需要将其存储在模型中单独的 Char
类型字段中。
同样,当 Django 为你做这件事时,你为什么要自己做呢?这就是为什么没有人这样做的原因。此外,以标准 UTC 时间存储时间是一种很好的做法,以便它可以轻松转换为任何其他区域。
关于django - 使用 Django 1.6 和 PostGreSQL 9.2 存储时区感知日期时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36034573/