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

Flask从MySQL读取datetime(6)显示错误时间的原因咨询

问题原因与解决方案

问题原因

  1. mysql.connector客户端的时区转换行为:
    尽管MySQL的DATETIME类型本身不存储时区信息,服务器端也不会对其做时区转换,但你使用的mysql.connector客户端库在读取数据时,会依据客户端运行环境的时区自动将数据库中存储的DATETIME值转换为对应时区的datetime对象。你的机器时区为UTC+05:30,因此数据库中存储的UTC时间2001-02-18 20:00:33被客户端转换为本地时区时间(20:00:33减去5.5小时,即14:30:33),随后Flask将这个datetime对象序列化为GMT格式的字符串返回。
  2. MySQL Workbench与客户端的差异:
    MySQL Workbench显示正确是因为它默认直接读取数据库中存储的原始字符串格式DATETIME值,或是其内部时区设置为UTC,未执行自动时区转换。

解决方案

方法1:连接MySQL时指定UTC时区

在mysql.connector.connect中添加time_zone='+00:00'参数,强制客户端使用UTC时区解析数据,避免自动转换:

db = mysql.connector.connect(
  host="localhost",
  user="root",
  time_zone='+00:00'
)

方法2:查询时直接获取字符串格式的时间

修改SQL查询,使用CAST将DATETIME转为字符串返回,绕过客户端的时区转换逻辑:

cursor.execute("SELECT CAST(timestampInUTC AS CHAR) from s_status where id=8")

方法3:在Flask中手动转换为UTC时间字符串

如果已经获取到转换后的datetime对象,可手动将其转回UTC时间的字符串格式:

from datetime import datetime

@app.route("/test_route")
def test_route():
    # 提取并转换时间
    local_time = data[0][1]
    utc_time_str = local_time.astimezone(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')
    return {"8": [["active", utc_time_str]]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:38:26