Django从PostgreSQL取数展示时修正时区并修改日期格式方法
解决方案
1. 先检查基础配置
首先确认项目settings.py中的时区配置正确:
USE_TZ = True # 替换为你实际使用的时区,此处对应数据库存储的+03:30时区为亚洲/德黑兰 TIME_ZONE = 'Asia/Tehran' # 关闭自动本地化时间格式,避免自定义格式被覆盖 USE_L10N = False # 全局统一datetime展示格式,配置后无需在每个场景单独指定格式 DATETIME_FORMAT = 'Y-m-d H:i:s'
2. 不同场景的格式化方法
模板中展示
直接使用Django内置的date过滤器指定格式即可:
{{ 实例对象.created_at|date:"Y-m-d H:i:s" }}
如果需要强制使用原始时区不做转换,可以搭配unlocalize过滤器:
{% load l10n %} {{ 实例对象.created_at|unlocalize|date:"Y-m-d H:i:s" }}
视图中直接处理
如果是在视图逻辑中需要生成格式化后的时间字符串,使用localtime转换时区后调用strftime即可:
from django.utils import timezone # 从数据库查询到对象 obj = YourModel.objects.get(pk=1) # 转换为配置的本地时区 local_created_at = timezone.localtime(obj.created_at) # 格式化输出 formatted_time = local_created_at.strftime("%Y-%m-%d %H:%M:%S")
表单中展示
如果是表单字段的默认值显示需要对应格式,修改表单字段的widget和input_formats配置:
from django import forms class YourForm(forms.ModelForm): created_at = forms.DateTimeField( input_formats=['%Y-%m-%d %H:%M:%S'], widget=forms.DateTimeInput(format='%Y-%m-%d %H:%M:%S') ) class Meta: model = YourModel fields = ['created_at']
DRF序列化场景
如果使用Django REST Framework返回接口数据,在序列化器中指定时间字段的格式:
from rest_framework import serializers class YourModelSerializer(serializers.ModelSerializer): created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") class Meta: model = YourModel fields = '__all__'
问题原说明
我使用Django向PostgreSQL数据库提交数据,提交功能运行正常,数据库中存储的时间戳准确且与时区匹配。我使用如下代码创建数据库中的时间字段:
created_at = models.DateTimeField(auto_now_add=True)
数据库中存储的时间格式如下:
2021-10-05 20:18:41.773503+03:30
当前遇到的问题为:从数据库读取数据展示到表格时,时区显示不正确,日期格式会变为Oct. 5, 2021, 4:48 p.m.且不带时区信息。
要求实现效果:时间按2021-10-05 20:18:41的格式展示
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

