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

如何将Django返回的datetime.timedelta转换为时分秒格式

问题背景

我有一个存储时间的SQL表,查询结果如下:

+-----------+----------+
| from_time | to_time  |
+-----------+----------+
| 09:00:00  | 22:00:00 |
+-----------+----------+
1 row in set (0.00 sec)

数据格式为Hours:minutes:seconds。但当我在Django中执行原生SQL查询select from_time, to_time from Tollapp_configure;时,得到的结果却是((datetime.timedelta(0, 32400), datetime.timedelta(0, 79200)),)。

我的Django模型定义如下:

class Configure (models.Model):
    from_time = models.TimeField()
    to_time = models.TimeField()

想请教下怎么把这个timedelta的结果转换成09:00:00、22:00:00这样的时分秒格式?


解决方案

其实这个问题的根源在于,当你用原生SQL查询Django的TimeField时,数据库返回的时间值会被Python解析为datetime.timedelta对象(因为纯时间类型在Python标准库中没有直接对应,用timedelta来表示从午夜开始的时长)。下面给你几种实用的解决办法:

1. 优先用Django ORM查询(最省心)

这是最推荐的方式,Django的ORM会自动把TimeField映射为datetime.time对象,直接就能格式化:

# 用ORM获取第一条数据
config = Configure.objects.first()

# 直接用strftime格式化time对象
from_time_str = config.from_time.strftime("%H:%M:%S")
to_time_str = config.to_time.strftime("%H:%M:%S")

print(from_time_str)  # 输出 09:00:00
print(to_time_str)    # 输出 22:00:00

2. 手动转换timedelta为时分秒字符串(原生SQL场景)

如果必须用原生SQL查询,有两种转换方式:

方式A:转成datetime.time再格式化

import datetime

# 假设原生查询的结果是result
result = ((datetime.timedelta(0, 32400), datetime.timedelta(0, 79200)),)
from_delta = result[0][0]
to_delta = result[0][1]

# 把timedelta加到午夜的datetime上,再取time部分
from_time = (datetime.datetime.min + from_delta).time()
to_time = (datetime.datetime.min + to_delta).time()

# 格式化输出
from_time_str = from_time.strftime("%H:%M:%S")
to_time_str = to_time.strftime("%H:%M:%S")

方式B:直接计算时分秒

自己写个小函数来解析timedelta的总秒数:

def delta_to_time_str(delta):
    total_sec = delta.total_seconds()
    hours = int(total_sec // 3600)
    minutes = int((total_sec % 3600) // 60)
    seconds = int(total_sec % 60)
    # 用f-string补零格式化
    return f"{hours:02d}:{minutes:02d}:{seconds:02d}"

# 应用到你的查询结果
result = ((datetime.timedelta(0, 32400), datetime.timedelta(0, 79200)),)
from_time_str = delta_to_time_str(result[0][0])
to_time_str = delta_to_time_str(result[0][1])

3. 在数据库层面直接格式化(SQL端处理)

你也可以修改SQL查询,用数据库的内置函数直接返回格式化后的字符串,比如MySQL可以这样写:

SELECT TIME_FORMAT(from_time, '%H:%i:%s') AS from_time, 
       TIME_FORMAT(to_time, '%H:%i:%s') AS to_time 
FROM Tollapp_configure;

这样查询出来的结果直接就是09:00:00这样的字符串,不需要在Python里再处理。


内容的提问来源于stack exchange,提问作者Janardhan Reddy. Meeniga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:23:41