Django中时区无法正常工作

5

我希望在 Django 中更改时区,因此我阅读了相关文档并得到以下内容:

#settings.py
TIME_ZONE = 'Europe/Ljubljana'

#models.py   #date_time gets filled with "auto_now=True")
date_time = models.DateTimeField(auto_now=True)

给定位置(Europe/Ljubljana)的UTC DST偏移量为+2,而在我的数据库中,我看到的是UTC时间戳。那么我错过了什么吗?

或者这是否按预期工作,因此将为每个请求单独处理(对于处于不同时区的人很有用)?但如果是这种情况,设置TIME_ZONE = 'Europe/Ljubljana'有什么用处呢?

1个回答

5
文档中得知:
启用时区支持后,Django会将datetime信息存储在UTC时间格式中,并在模板和表单中使用带有时区的datetime对象,并将其转换为最终用户的时区。因此,在数据库中,datetime始终以UTC时间格式存储,但在模板和表单中将显示正确的时区。
要在其他地方获取正确时区的日期,请使用astimezone()函数。
>>> from myapp.models import Details
>>> import pytz
>>> d = Details.objects.get(pk=1)
>>> d.added
datetime.datetime(2016, 5, 28, 18, 59, 55, 841193, tzinfo=<UTC>)
>>> localdate = d.added.astimezone(pytz.timezone('Europe/Ljubljana'))
>>> localdate
datetime.datetime(2016, 5, 28, 20, 59, 55, 841193, tzinfo=<DstTzInfo 'Europe/Ljubljana' CEST+2:00:00 DST>)

嗯,这对我来说似乎是个问题,因为我想将这个时间戳转换为 epoch - 高图表所需的格式。有任何解决方法建议吗? - user3053452
1
通过在您的DATABASE设置中设置TIME_ZONE选项,您可以强制Django将日期时间存储为本地时间 - 但这将强制您使用不支持时区的数据库(如SQLite,MySQL,Oracle)。 - rafalmp
很酷,我目前正在使用MySQL,所以我会研究一下! - user3053452
啊,我忘了更简单和可互操作的方法 - 你可以使用 astimezone 函数来在运行时在不同的时区之间进行转换:date_time.astimezone(pytz.timezone('Europe/Ljubljana')),我的错。 - rafalmp
当我从数据库调用时,我应该在我的脚本中使用这段代码片段吗? - user3053452
更新了我的答案,包括使用astimezone()的更详细示例。 - rafalmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接