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

如何在Flask中格式化MySQL存储的time类型时间用于页面展示

MySQL TIME类型转12小时制时间格式解决方案

错误原因

MySQL的TIME类型字段在Python MySQL驱动中默认会被映射为datetime.timedelta对象,而非datetime.time对象:

  • timedelta本身没有strftime方法,所以直接调用会抛属性错误
  • timedelta转字符串的格式不固定,仅当时间值在0~24小时区间内才会显示为HH:MM:SS格式,超出范围时格式会变化,因此直接截取字符串的方案不稳定,容易失效。

解决方案

方案1:后端预处理(推荐)

在后端将查询得到的timedelta转换为datetime.time对象后再传给模板,后续模板可以直接调用strftime方法:

from datetime import time

# 处理单条数据的time字段
seconds = int(invoice['time'].total_seconds())
hours = seconds // 3600
minutes = (seconds % 3600) // 60
invoice['time'] = time(hour=hours, minute=minutes)

模板中原有的写法即可正常运行:

{{ invoice['time'].strftime("%I:%M %p") }}

方案2:直接在Jinja模板中处理

如果不方便修改后端代码,可以直接在模板内完成转换:

输出12小时制10:34 PM格式

{% set total_sec = invoice['time'].total_seconds() %}
{% set hours = total_sec // 3600 %}
{% set minutes = (total_sec % 3600) // 60 %}
{% set am_pm = 'AM' if hours < 12 else 'PM' %}
{% set twelve_hour = hours % 12 if hours % 12 != 0 else 12 %}
{{ "%02d:%02d %s" % (twelve_hour, minutes, am_pm) }}

输出24小时制22:34格式

{% set total_sec = invoice['time'].total_seconds() %}
{{ "%02d:%02d" % (total_sec // 3600, (total_sec % 3600) // 60) }}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:15:01