>我有一个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
时仍然返回朴素的日期时间。
您需要选择当前时区。
您应该使用 activate() 将当前时区设置为最终用户的实际时区。否则,将使用默认时区。
以下文档中的一些相关摘录。
默认时区是TIME_ZONE设置定义的时区。
当前时区是用于渲染的时区。
您应该使用 activate() 将当前时区设置为最终用户的实际时区。否则,将使用默认时区。
来自: https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/#default-time-zone-and-current-time-zone
我建议将所有datetime
存储在内部的UTC中,以便在settings.py
中设置TIME_ZONE = 'UTC'
,然后将当前时区切换到您希望输出的时区。这将使您以后更容易添加更多时区,并使任何日期或时间算术变得更加容易,特别是如果您必须考虑任何夏令时更改。如果您真的不需要它,也许完全禁用时区会更容易。
您可以创建中间件并使用激活功能设置特定的时区。
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',
]
{% load tz %}
{{ value|localtime }}
https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/#template-filters
尝试 django-datetime-widget 并使用配置:
如果要使用本地化:
- 在 settings.py 中设置 USE_L10N = 真,USE_TZ = 真,USE_I18N = 真
- 将"django.middleware.locale.LocaleMiddleware"添加到 settings.py 中的MIDDLEWARE_CLASSES
- 当你创建小部件时,添加 usel10n = True like 属性:DateTimeWidget(usel10n=True)
链接在这里:
https://github.com/asaglimbeni/django-datetime-widget
在settings.py文件中
将TIME_ZONE='亚洲/巴格达'更改为您所在国家/地区的时区名称。