9

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,我得到2013-10-06 17:00:00+00:00. 当我尝试在模板中呈现此信息时也会发生同样的情况。

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

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

4

2 回答 2

24

我已经弄清楚发生了什么。根据我在此处阅读的文档中的内容,我假设使用Django 会在任何地方USE_TZ=True输出当前时区(默认为TIME_ZONE设置)的日期时间——视图、shell 等。

然而,事实证明 Django在模板中进行转换,即使这样也只在datetime对象的最直接、基本的调用中进行。

具体来说,如果你有一个objectwith a并且你在一个模板中使用DateTimeField渲染它的属性,你会得到一个转换为当前时区的日期时间。耶。但是,此功能不适用于其他任何内容,即使在模板中也是如此,例如(将以 UTC 显示小时)。所以它基本上只是一个不可见的模板标签。没有我希望的那么神奇!datetime{{ object.datetime }}{{ object.datetime.hour }}

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

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

from django.utils.timezone import localtime

result = localtime(some_time_object)

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

于 2013-10-03T03:20:30.453 回答
2

你看过localtime模板标签吗

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

于 2013-10-02T09:54:51.403 回答