我有一个Django(v1.10.6)项目,其中包含一些带有日期时间字段的模型,例如:
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
。
答案 0 :(得分:1)
您可以创建中间件,并使用activate函数来设置特定时区。
middleware.py
import pytz
import requests
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tzname = 'America/Bogota'
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
settings.py
MIDDLEWARE = [ ........
'projectname.middleware.TimezoneMiddleware',
]
答案 1 :(得分:0)
您需要选择当前时区。
您应该使用activate()将当前时区设置为最终用户的实际时区。否则,使用默认时区。
以下文档中的一些相关摘录。
默认时区是TIME_ZONE设置定义的时区。
当前时区是用于渲染的时区。
您应该使用activate()将当前时区设置为最终用户的实际时区。否则,使用默认时区。
我建议将所有datetime
存储在UTC内部,以便在TIME_ZONE = 'UTC'
中设置settings.py
,然后将当前时区切换到您希望输出的时区。将使您更容易在以后添加更多时区,并使任何日期或时间算术更容易,特别是如果您不得不考虑任何夏令时变化。 如果你真的不需要它可能更容易完全禁用时区。
答案 2 :(得分:0)
{% load tz %}
{{ value|localtime }}
https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/#template-filters
答案 3 :(得分:0)
尝试使用django-datetime-widget并使用配置:
如果您想使用本地化:
链接在这里: