如何在特定时区的 Django 中显示日期时间?



>我有一个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='亚洲/巴格达'更改为您所在国家/地区的时区名称。

相关内容

  • 没有找到相关文章

最新更新