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

