【问题标题】:Correctly saved timezone aware datetime object appearing timezone unaware when accessed in Django app在 Django 应用程序中访问时正确保存时区感知日期时间对象出现时区不感知
【发布时间】:2016-10-06 12:35:36
【问题描述】:

在我维护的带有 postgresql 后端的 Django 应用程序中,用户登录并发布 cmets。每条评论都有一个与之关联的时间戳。

创建评论对象时,我会这样做:

now = datetime.now()
Comment.objects.create(commenter=self.request.user, when=now, text='text')

now 是时区感知的 - 即我是 UTC +530,now 正确编码该信息。如果我使用 psql 并查看在 Comment postgresql 表中创建的条目,我会看到 datetime 对象的正确值。

但是,如果我从 Django 应用程序访问同一个对象,并且 print 取出它的日期时间戳,我会看到一个时区 unaware 对象。 IE。一个不知道我在 UTC +530 的日期时间对象。

这完全打乱了我的逻辑。如何确保在 Django 应用程序中获得保存在其相关 postgresql 表中的相同日期时间对象?值得注意的是,这两个输出是不同的,我可能做错了什么。救命!

【问题讨论】:

  • datetime.now() 永远不会感知时区,这与 datetime.utcnow() 不同
  • @Apero:那么我通过psql 在表中看到时区感知值是否是postgresql 的一个怪癖?你觉得这里发生了什么?我正在尝试理解它。
  • 我相信 postgres 确实将它存储在自己的时区中。 @Elwin Arens 提到的 django 设置 USE_TZ 在将它从 postgres 反序列化为 python 时将花费时间到 datetime 对象中。

标签: python django postgresql datetime


【解决方案1】:

使用timezone.now() 代替 datetime.now():

from django.utils import timezone
timezone.now()

为整个应用程序(包括 PostgreSQL 架构更新)获取全局时区或不带时区的 now()。有无时区取决于USE_TZ 设置。

【讨论】:

  • 使用timezone.now()USE_TZ=True,以避免出现模棱两可的时间。
猜你喜欢
  • 2020-12-03
  • 2017-06-26
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2020-10-15
  • 2011-10-27
相关资源
最近更新 更多