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

问题描述:

我有一个Django(v1.10.6)的项目,有一些机型日期时间字段,例如:如何在特定时区的Django中显示日期时间?

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

请这样写: ​​ 评论这条线在settings.py

您需要选择当前时区。

您应该使用activate()将当前时区设置为最终用户的实际时区。否则,使用默认时区。

以下文档的一些相关摘录。

默认时区是由TIME_ZONE设置定义的时区。

当前时区是用于渲染的时区。

您应该使用activate()将当前时区设置为最终用户的实际时区。否则,使用默认时区。

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

我推荐所有存储在内部UTC所以设置在settings.pyTIME_ZONE = 'UTC'以及当前的时区切换到你想输出是在时区的datetime的这将使以后再添加更多时间区域会更容易,并且使日期或时间算法更加容易,特别是如果您必须考虑夏时制时间的变化。 如果你真的不需要它,也许完全禁用时区更容易。

+0

'当前时区用于渲染的时区“。我想在'美国/波哥大'时区渲染,因此我设置了'TIME_ZONE ='America/Bogota'',并且我在UTC内存储了日期时间。问题在于它仍然以UTC格式呈现*。 – vero4ka

+0

@ vero4ka'TIME_ZONE'设置存储'默认时区'而不是'当前时区'。要启用当前时区,需要按照上面链接的文档 – Inti

+0

中描述的那样,使用当前时区调用'activate()',我在'settings.py'中编写了'timezone.activate(TIME_ZONE)',但它没有帮助 – vero4ka

+0

我想要一个具有特定时区的全局设置,而不是在每个模板中编写'| localtime' – vero4ka

+0

然后,也许你可以在视图中设置它。 – XaviP

尝试Django的日期时间的微件和应用配置:

如果你想使用本地化:

  • 设置USE_L10N =真,USE_TZ = True和USE_I18N = True在settings.py
  • 将'django.middleware.locale.LocaleMiddleware'添加到MIDDLEWARE在settings.py
  • 当您创建窗口小部件添加_CLASSES = usel10n像真实属性:DateTimeWidget(usel10n = TRUE)

链接是在这里:

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