You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:15:02