gpt4 book ai didi

Django似乎以UTC格式显示日期时间

转载 作者:行者123 更新时间:2023-12-04 09:31:26 25 4
gpt4 key购买 nike

settings.py中,我有:

TIME_ZONE = 'Asia/Singapore'
USE_I18N = True
USE_L10N = True
USE_TZ = True

如果用户(居住在新加坡)以我网站上的形式输入 2013-10-07 01:00 A.M.,则存储在我的(PostgreSQL)数据库中的值为 2013-10-07 01:00:00+08。在 python manage.py shell session 中提取此信息时,我得到 2013-10-06 17:00:00+00:00。当我尝试在模板中呈现此信息时,也会发生同样的情况。

我认为发生了什么:Django意识到用户正在输入1:00 AM。新加坡时间10月10日,并将其存储为 2013-10-07 01:00:00+08到数据库中。但是,当Django从数据库中检索此信息时,会将其格式化为UTC时间,从而给出 2013-10-06 17:00:00+00:00

我有那个权利吗?如果是这样,我该如何使用数据库中存储的相同时区信息(或至少使用我的 TIME_ZONE设置)使Django显示时间?换句话说,如何使用户看到与输入日期完全相同的日期时间?

最佳答案

我已经知道发生了什么事。根据我在here文档中所阅读的内容,我假设使用USE_TZ=True,Django会在当前时区( View ,shell等)各处输出当前时区的日期时间(默认为TIME_ZONE设置)。

但是,事实证明,Django仅在模板中进行转换,即使如此,也仅在datetime对象的最直接,最基本的调用中进行转换。

具体来说,如果您有一个带有objectDateTimeField,并使用datetime在模板中呈现了{{ object.datetime }}属性,则您将获得一个转换为当前时区的日期时间。耶。但是,此功能无法用于其他任何功能,即使在模板中也无法使用,例如{{ object.datetime.hour }}(将以UTC显示小时)。因此,它基本上只是一个不可见的模板标签。不像我希望的那样神奇!

看来我需要先将所有日期时间转换为 View 中的当前时区,然后再将其传递到模板中。考虑到我的数据库已经将所有日期时间存储在我希望它们显示的时区中,我发现这种奇怪和违反直觉的事情。必须明确地告诉Django您想要UTC表示的数据库值,这不是更有意义的事情,而不是让Django自动执行工作,然后让您将其更改回您的 View ?

编辑: SO上的此answer使解决我特定情况的方法变得相当容易:

from django.utils.timezone import localtime

result = localtime(some_time_object)

编辑:事实证明,只有PostgreSQL存储时区信息,并且该信息与其存储的原始日期时间值(以UTC表示)分开。因此,我认为对于Django默认情况下以UTC呈现所有内容是有意义的,因为其他数据库后端甚至都不存储时区信息。

关于Django似乎以UTC格式显示日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19134191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com