在 Django 中检索时区感知 DateTimeField

Posted

技术标签:

【中文标题】在 Django 中检索时区感知 DateTimeField【英文标题】:Retrieve timezone aware DateTimeField in Django 【发布时间】:2016-09-28 08:57:36 【问题描述】:

在我的模型中,我有一个DateTimeField

class ReturnEvent(models.Model):
  book_title = models.CharField()
  return_time = models.DateTimeField()

当我检索到要打印的return_time 时,例如:

return_event = ReturnEvent.objects.get(id=1)
print(return_event.return_time.strftime("%H:%M"))

我看到日期时间不知道时间像:

2016-06-18 08:18:00+00:00

不过,我喜欢使用 strftime 查看本地时间。

2016-06-18 10:18:00+02:00

有没有快速的解决方案?

【问题讨论】:

您在settings.py 中设置了USE_TZ = True 吗? 【参考方案1】:

如果您的设置中有USE_TZ = True,Django 将数据库中的所有日期时间对象存储为UTC,并在模板中渲染时将它们从settings.py 即时转换为您的TIME_ZONE=XYZ

这就是为什么当从数据库中检索时,datetime 对象可以识别时区,但它的时区为 UTC(因此 2016-06-18 08:18:00+00:00 中的 +00:00)。因为,您自己将时间转换为str(而不是在模板中呈现),因此Django 不会将其转换为您的TIME_ZONE 设置。您需要自己将其转换为所需的时区。

如果您想将其从 TIME_ZONE 设置转换为时区,您可以这样做

from django.utils import timezone
to_tz = timezone.get_default_timezone()
print return_event.return_time.astimezone(to_tz).strftime("%H:%M")

【讨论】:

以上是关于在 Django 中检索时区感知 DateTimeField的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中获取随机时区感知日期时间

使用 django 查询返回活动时区中的日期时间

使用 pymongo 创建时区感知 ISODate

时区感知日期

如何在 django 中获取时区感知日期?

Python 中的 datetime.fromtimestamp(os.path.getctime()) 是不是给了我一个时区感知值?