如何将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
相关产品推荐
相关产品推荐

