Flask从MySQL读取datetime(6)显示错误时间的原因咨询
问题原因与解决方案
问题原因
- 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格式的字符串返回。 - 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
相关产品推荐
相关产品推荐

