Flutter同步数据至MySQL时DateTime日期字段为空问题
日期字段同步为空解决步骤
按以下顺序逐一排查,覆盖99%同类问题:
- 先校验本地时间戳合法性
在构造请求参数前加打印日志,确认本地存的时间戳是合法值:
正常13位毫秒时间戳对应近年时间的取值范围在1577808000000(2020年)到1893456000000(2030年)之间,如果打印出来时间戳是字符串、是10位秒级值、是0/空值,转换出来的时间会是1970年、无效日期这类异常值,后端解析失败就会写入空值,这种情况先修复SQLite存储时间戳的逻辑,确保存的是int类型的13位毫秒值。// 加在created_at赋值前 final rawTs = clientList[i].createdAt; print('原始时间戳值:$rawTs,类型:${rawTs.runtimeType}'); final parsedTime = DateTime.fromMillisecondsSinceEpoch(rawTs); print('转换后时间:$parsedTime,ISO输出:${parsedTime.toIso8601String()}'); - 调整时间传参格式适配后端解析
你当前传的ISO8601格式是YYYY-MM-DDTHH:mm:ss.sss带T分隔符、带毫秒的结构,绝大多数后端框架默认配置不识别这种格式,会直接把created_at字段解析为null,最终写入数据库为空。
兼容性最高的传法是直接传MySQL原生支持的YYYY-MM-DD HH:mm:ss格式字符串,不用改后端配置就能识别:
这行代码输出的时间格式类似"created_at": parsedTime.toString().substring(0, 19),2024-05-20 14:30:22,和MySQL的DATETIME类型完全匹配。 - 核对后端与数据库配置
- 先抓包确认发出的POST请求体里
created_at字段值正常,如果请求体里值没问题,问题和Flutter端无关,去查后端接口的字段映射:确认后端接口的created_at字段没有被标记为忽略、没有类型绑定错误。 - MySQL中
created_at字段用DATETIME类型即可,不要用TIMESTAMP类型做测试,同时确认字段没有设置NOT NULL约束但无默认值的冲突,避免解析失败时触发隐式赋值导致空值。
- 先抓包确认发出的POST请求体里
注意:你贴的代码里
htpp.post存在拼写错误,正常应为http.post,如果其他字段能正常同步说明是贴代码时的笔误,无需额外处理。
内容的提问来源于stack exchange,提问作者Bothwell Nhidza
相关产品推荐
相关产品推荐

