Flutter/Dart中Duration小时差判断失效问题:早于24小时的日期未按预期返回
问题出在时间差的正负上!
嘿,我一眼就发现你代码里的问题了——你计算时间差的顺序搞反了,导致判断条件永远不触发!
你看,publishtime是10天前的时间,比当前的now早。当你调用publishtime.difference(now)时,Dart返回的Duration是一个负数(因为前者在后者之前)。也就是说difference.inHours的结果是-240,而不是你预期的240。这时候difference.inHours > 24这个条件肯定不成立,代码自然就走到了返回小时差值的分支。
怎么修复?
有两种简单的办法,推荐第一种,语义更清晰:
方法1:调换时间差的计算顺序
改成用当前时间减去发布时间,这样得到的就是正数的时间差,完全符合我们“计算过去了多久”的逻辑:
Duration difference = now.difference(publishtime);
这样10天前的发布时间会得到240小时的差值,>24的条件就会触发,返回格式化后的日期。
方法2:判断绝对值(不推荐,但可行)
如果你不想调换顺序,也可以取时间差的绝对值来判断:
if (difference.inHours.abs() > 24) { // 返回格式化日期 }
不过第一种方法更直观,别人读代码的时候一眼就能明白你在算“从发布到现在过了多久”。
修正后的完整代码
String _getTime() { String time; DateTime now = DateTime.now(); // 调换顺序,计算当前时间与发布时间的正向差值 Duration difference = now.difference(publishtime); if (difference.inHours > 24) { var format = DateFormat("dd.MM.yyyy"); time = format.format(publishtime); } else { // 现在差值是正数,不用再替换负号了 time = "${difference.inHours} hours ago"; } return time; }
这样修改后,当发布时间超过24小时,就会返回dd.MM.yyyy格式的日期;如果在24小时内,就返回对应的小时数,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Kyrill
相关产品推荐
相关产品推荐

