Flutter中如何计算两个格式化日期的时间差并以字符串形式展示
Flutter 双日期差值拼接展示实现
你现有代码存在冗余转换问题:ticketData里调用toDate()拿到的本身就是DateTime实例,不需要再转字符串后二次parse,既浪费性能还可能触发时区转换偏差。
核心逻辑
- 先把创建日期、截止日期的DateTime对象提取出来,统一抹除时分秒精度,只保留年月日维度计算,避免当天不同时间点导致天数差计算不准
- 用DateTime内置的
difference()方法计算时间间隔,取inDays属性得到整数天数 - 格式化日期后把差值文本拼接到截止日期字符串尾部即可
完整可运行代码
// 预处理日期 final createdDateTime = ticketData['date_created'].toDate(); final dueDateTime = ticketData['due_date'].toDate(); // 仅保留年月日维度,消除时分秒影响 final createdDay = DateTime(createdDateTime.year, createdDateTime.month, createdDateTime.day); final dueDay = DateTime(dueDateTime.year, dueDateTime.month, dueDateTime.day); // 计算天数差 final gapDays = dueDay.difference(createdDay).inDays; // 格式化展示文本 final createdText = DateFormat('d MMM y').format(createdDateTime); final dueText = "${DateFormat('d MMM y').format(dueDateTime)} ($gapDays Days)"; // UI组件部分 Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Created: $createdText', style: primaryColor400Style.copyWith(fontSize: fontSize13), ), // 原代码的TextSpan需要包裹在Text.rich中才能正常渲染 Text.rich( TextSpan( text: dueText, style: weight400Style.copyWith(fontSize: fontSize14, color: hintColor), ), ) ], )
补充说明
运行后输出效果和预期完全一致:
6 Jun 2022
14 Jun 2022 (8 Days)
如果需要适配单复数场景(间隔1天时显示1 Day),加个简单判断即可:final gapText = gapDays == 1 ? "1 Day" : "$gapDays Days";
再把gapText拼到截止日期尾部就行。
内容的提问来源于stack exchange,提问作者Kim San
相关产品推荐
相关产品推荐

