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

GCh*_*orn 6 django timezone datetime

settings.py我有:

TIME_ZONE = 'Asia/Singapore'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)

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

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

我有这个权利吗?如果是这样,我可以做些什么来使用存储在数据库中的相同时区信息(或至少使用我的TIME_ZONE设置)来显示Django时间?换句话说,我怎样才能让用户以与输入日期时完全相同的形式看到日期时间?

GCh*_*orn 18

我已经弄清楚发生了什么.根据我的文档读到这里,我假设有USE_TZ=True,Django的将在当前时区输出日期时间(默认的TIME_ZONE设置)到处 --views,外壳等.

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

具体来说,如果您object使用a DateTimeFielddatetime使用模板在模板中呈现其属性{{ object.datetime }},则会获得转换为当前时区的日期时间.好极了.但是,即使在模板中,此功能也不适用于任何其他内容,例如{{ object.datetime.hour }}(以UTC格式显示小时).所以它基本上只是一个不可见的模板标签.不像我希望的那样神奇!

看起来我需要将所有日期时间转换为我的视图中的当前时区,然后再将它们传递给我的模板.考虑到我的数据库已经存储在我希望它们显示的时区中的所有日期时间,我发现这种奇怪和违反直觉.如果必须明确地告诉Django你想要用UTC表示的数据库值,那就没有意义了吗?让Django自动执行工作,然后让你在视图中更改它们?

编辑:这个关于SO的答案使我的具体情况的解决方案变得相当容易:

from django.utils.timezone import localtime

result = localtime(some_time_object)
Run Code Online (Sandbox Code Playgroud)

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


roc*_*ier 2

你看过localtime模板标签了吗

更新:但是,这确实指的是您所拥有的USE_TZ设置True