如何在特定时区的Django中显示日期时间?
我有一个Django(v1.10.6)的项目,有一些机型日期时间字段,例如:如何在特定时区的Django中显示日期时间?
created_at = models.DateTimeField(auto_now_add=True)
存储在PostgreSQL数据库没有时区信息:
created_at timestamp without time zone NOT NULL
postgresql.conf
:
timezone = 'UTC'
我想要我的应用程序的所有日期显示在America/Bogota
时区(它不应该依赖于用户的实际时区),所以我settings.py
文件中有如下配置:
TIME_ZONE = 'America/Bogota'
USE_I18N = False
USE_L10N = True
USE_TZ = True
SHORT_DATETIME_FORMAT = 'd-m-Y H:i:s'
SHORT_DATE_FORMAT = 'd-m-Y'
TIME_FORMAT = 'H:i:s'
,但是当我写
{{ object.created_at|date:'SHORT_DATETIME_FORMAT' }}
模板
,它仍然显示在UTC
格式的日期。
更新:
添加以下的中间件,但它并没有帮助:
class TimezoneMiddleware(MiddlewareMixin):
def process_request(self, request):
timezone.activate(pytz.timezone(settings.TIME_ZONE))
更新2:
它的工作方式如下:
import pytz
from django.utils import timezone
timezone.is_naive(object.created_at) # True
object.created_at.replace(tzinfo=timezone.utc)
(迫使日期在UTC
时区,然后将它传递给模板,而不使用localize
过滤器),但我不明白为什么Django仍然返回天真的日期时间USE_TZ
设置为True
。
请这样写: 评论这条线在settings.py
您需要选择当前时区。
您应该使用activate()将当前时区设置为最终用户的实际时区。否则,使用默认时区。
以下文档的一些相关摘录。
默认时区是由TIME_ZONE设置定义的时区。
当前时区是用于渲染的时区。
您应该使用activate()将当前时区设置为最终用户的实际时区。否则,使用默认时区。
我推荐所有存储在内部UTC所以设置在settings.py
TIME_ZONE = 'UTC'
以及当前的时区切换到你想输出是在时区的datetime
的这将使以后再添加更多时间区域会更容易,并且使日期或时间算法更加容易,特别是如果您必须考虑夏时制时间的变化。 如果你真的不需要它,也许完全禁用时区更容易。
{% load tz %}
{{ value|localtime }}
https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/#template-filters
尝试Django的日期时间的微件和应用配置:
如果你想使用本地化:
- 设置USE_L10N =真,USE_TZ = True和USE_I18N = True在settings.py
- 将'django.middleware.locale.LocaleMiddleware'添加到MIDDLEWARE在settings.py
- 当您创建窗口小部件添加_CLASSES = usel10n像真实属性:DateTimeWidget(usel10n = TRUE)
链接是在这里:
'当前时区用于渲染的时区“。我想在'美国/波哥大'时区渲染,因此我设置了'TIME_ZONE ='America/Bogota'',并且我在UTC内存储了日期时间。问题在于它仍然以UTC格式呈现*。 – vero4ka
@ vero4ka'TIME_ZONE'设置存储'默认时区'而不是'当前时区'。要启用当前时区,需要按照上面链接的文档 – Inti
中描述的那样,使用当前时区调用'activate()',我在'settings.py'中编写了'timezone.activate(TIME_ZONE)',但它没有帮助 – vero4ka