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

Flutter DateTime时间差计算错误:本地时间与UTC时区问题排查

解决UTC时间与本地时间时差计算错误的问题

从数据库中获取了格式为2022-10-02T23:10:24.736Z的UTC时间,想要将其与当前时间比较并获取秒级差值。现有代码由于DateTime.now()为本地时间,与数据库的UTC时间时区不统一,导致计算出的时间差为122分钟,实际应为2分钟,代码如下:

DateTime datenow = DateTime.now();
DateTime dateFormDatabase = DateTime.parse(widget.data[widget.currIndex-1]["roundEnd"]);

print(datenow); // <---- 2022-10-01 23:22:45.522687
print(dateFormDatabase); // <--- 2022-10-01 23:25:24.736Z

var diff = dateFormDatabase.difference(datenow);
print(diff.inMinutes); // <--- 122 but it should be 2minutes

解决方法

问题出在时区不统一:数据库返回的是UTC标准时间(末尾带Z标识),但DateTime.now()获取的是设备所在时区的本地时间,直接计算差值会把时区偏移(比如东八区和UTC差8小时)也算进去,才会出现122分钟的错误结果。

有两种可靠的解决方式:

方式一:将当前时间转为UTC时间

把DateTime.now()替换为DateTime.now().toUtc(),让当前时间和数据库时间统一为UTC时区,再计算差值:

DateTime datenow = DateTime.now().toUtc(); // 获取当前UTC时间
DateTime dateFormDatabase = DateTime.parse(widget.data[widget.currIndex-1]["roundEnd"]);

print(datenow); // 输出格式类似:2022-10-01 23:22:45.522687Z
print(dateFormDatabase); // <--- 2022-10-01 23:25:24.736Z

var diff = dateFormDatabase.difference(datenow);
print(diff.inMinutes); // 正确输出2

方式二:将UTC时间转成本地时间

把数据库返回的UTC时间通过toLocal()转成本地时区时间,再和本地时间DateTime.now()比较:

DateTime datenow = DateTime.now();
DateTime dateFormDatabase = DateTime.parse(widget.data[widget.currIndex-1]["roundEnd"]).toLocal(); // 转本地时区

print(datenow); // <---- 2022-10-01 23:22:45.522687
print(dateFormDatabase); // 输出格式类似:2022-10-01 23:25:24.736

var diff = dateFormDatabase.difference(datenow);
print(diff.inMinutes); // 正确输出2

如果需要秒级差值,直接使用diff.inSeconds即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:50:34