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

时间:2017-03-31 15:14:19

标签: django timezone django-timezone

我有一个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

4 个答案:

答案 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()将当前时区设置为最终用户的实际时区。否则,使用默认时区。

来自:https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/#default-time-zone-and-current-time-zone

我建议将所有datetime存储在UTC内部,以便在TIME_ZONE = 'UTC'中设置settings.py,然后将当前时区切换到您希望输出的时区。将使您更容易在以后添加更多时区,并使任何日期或时间算术更容易,特别是如果您不得不考虑任何夏令时变化。 如果你真的不需要它可能更容易完全禁用时区。

答案 2 :(得分:0)

答案 3 :(得分:0)

尝试使用django-datetime-widget并使用配置:

如果您想使用本地化:

  • 在settings.py中设置USE_L10N = True,USE_TZ = True且USE_I18N = True
  • 将'django.middleware.locale.LocaleMiddleware'添加到settings.py中的MIDDLEWARE_CLASSES
  • 创建窗口小部件时,添加usel10n = True,如属性:DateTimeWidget(usel10n = True)

链接在这里:

https://github.com/asaglimbeni/django-datetime-widget