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

Django中如何将datetime.time转换为指定格式的字符串?

解决Django TimeField转指定字符串格式的几种方法

嘿,这个需求我在项目里刚处理过,给你整理了几个实用的方案,覆盖不同场景,你可以按需选择:

方法一:模型中添加自定义方法(最直观)

直接在你的Model类里加两个方法,分别返回12小时制(带AM/PM)和24小时制的字符串格式,调用起来非常方便。

假设你的模型是这样的:

from django.db import models

class Event(models.Model):
    event_time = models.TimeField()

给模型加上格式化方法:

def get_12h_time(self):
    # 格式化12小时制,自动区分AM/PM,%I是12小时制小时(01-12),%p是上午/下午标识
    return self.event_time.strftime("%I:%M:%S %p").lstrip('0')  # lstrip('0')可以去掉小时前的前置0,比如把02:03变成2:03

def get_24h_time(self):
    # 24小时制格式,%H是24小时制小时(00-23)
    return self.event_time.strftime("%H:%M:%S")

使用示例:

# 单个实例调用
event = Event.objects.first()
print(event.get_12h_time())  # 输出类似 "2:03:00 AM"
print(event.get_24h_time())  # 输出类似 "02:03:00"

# 如果用values()查询后想处理,可以先获取对象列表再遍历:
events = Event.objects.all()
formatted_events = [{'time_12h': e.get_12h_time(), 'time_24h': e.get_24h_time()} for e in events]

方法二:查询时用数据库函数直接格式化(适合批量查询)

如果你想直接在values()查询中就拿到格式化后的字符串,不用再遍历处理,可以利用Django的Func结合数据库的日期格式化函数来实现,不同数据库写法略有差异:

针对MySQL/MariaDB

from django.db.models import Func, Value, CharField
from django.db.models.functions import Cast

# 12小时制查询
events_12h = Event.objects.annotate(
    formatted_time_12h=Func(
        Cast('event_time', CharField()),
        Value('%h:%i:%s %p'),
        function='DATE_FORMAT',
        output_field=CharField()
    )
).values('formatted_time_12h')

# 24小时制查询
events_24h = Event.objects.annotate(
    formatted_time_24h=Func(
        Cast('event_time', CharField()),
        Value('%H:%i:%s'),
        function='DATE_FORMAT',
        output_field=CharField()
    )
).values('formatted_time_24h')

针对PostgreSQL

PostgreSQL用TO_CHAR函数,格式符略有不同:

# 12小时制
events_12h = Event.objects.annotate(
    formatted_time_12h=Func(
        'event_time',
        Value('HH12:MI:SS AM'),
        function='TO_CHAR',
        output_field=CharField()
    )
).values('formatted_time_12h')

# 24小时制
events_24h = Event.objects.annotate(
    formatted_time_24h=Func(
        'event_time',
        Value('HH24:MI:SS'),
        function='TO_CHAR',
        output_field=CharField()
    )
).values('formatted_time_24h')

方法三:序列化时处理(适合API场景)

如果是用Django REST Framework(DRF)返回API数据,可以自定义序列化字段来统一处理时间格式:

from rest_framework import serializers

class CustomTimeField(serializers.Field):
    def __init__(self, format_type='12h', **kwargs):
        self.format_type = format_type
        super().__init__(**kwargs)

    def to_representation(self, value):
        # value是datetime.time对象
        if self.format_type == '12h':
            return value.strftime("%I:%M:%S %p").lstrip('0')
        elif self.format_type == '24h':
            return value.strftime("%H:%M:%S")
        else:
            return str(value)

class EventSerializer(serializers.ModelSerializer):
    # 可以选择返回12小时制或24小时制
    event_time_12h = CustomTimeField(format_type='12h', source='event_time')
    event_time_24h = CustomTimeField(format_type='24h', source='event_time')

    class Meta:
        model = Event
        fields = ['event_time_12h', 'event_time_24h']

小细节提醒

  • 如果你的时间没有秒数(比如datetime.time(2,3)),格式化后会显示2:03:00,如果想去掉秒数,把格式符改成"%I:%M %p"(12小时制)或"%H:%M"(24小时制)即可。
  • %p在不同系统可能返回小写的am/pm,如果需要大写,可以加.upper(),比如value.strftime("%I:%M:%S %p").upper().lstrip('0')。

内容的提问来源于stack exchange,提问作者Mikebarson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:57:31