4

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

5 回答 5

1

您需要选择当前时区。

您应该使用 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,然后将当前时区切换到您希望输出所在的时区。这将使您以后更容易添加更多时区,并使任何日期或时间算术更容易,特别是如果您必须考虑任何夏令时更改。如果您真的不需要它,可能更容易完全禁用时区。

于 2017-03-31T15:19:41.180 回答
1

You can create a middleware and use activate function to set a specific time zone.

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',
]
于 2020-11-06T22:11:46.087 回答
0

settings.py文件中

TIME_ZONE = 'Asia/Baghdad'更改为您所在国家/地区的时区名称。

于 2022-01-24T14:14:38.803 回答
0

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

如果要使用本地化:

  • 在 settings.py 中设置 USE_L10N = True、USE_TZ = True 和 USE_I18N = True
  • 在 settings.py 中将 'django.middleware.locale.LocaleMiddleware' 添加到 MIDDLEWARE_CLASSES
  • 创建小部件时添加 usel10n = True 类似属性: DateTimeWidget(usel10n=True)

链接在这里:

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

于 2017-03-31T16:10:39.137 回答
0
{% load tz %}
{{ value|localtime }}

https://docs.djangoproject.com/en/1.10/topics/i18n/timezones/#template-filters

于 2017-03-31T15:24:30.567 回答