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

