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

Dart中如何实现最多回溯一周的自适应日期格式化

最优实现方案

你当前使用的是Dart intl包提供的日期格式化能力,不需要引入任何第三方依赖,直接封装一层判断逻辑即可满足需求,核心是先处理自然日差的计算(避免时分秒干扰跨天判断),再按规则分层返回结果。

可直接复用的代码

import 'package:intl/intl.dart';

String formatCustomDate(DateTime myDateTime) {
  final DateTime now = DateTime.now();
  // 把当前时间、目标时间都对齐到当日0点,消除时分秒对自然日差计算的干扰
  final DateTime today = DateTime(now.year, now.month, now.day);
  final DateTime targetDay = DateTime(myDateTime.year, myDateTime.month, myDateTime.day);
  final int dayDiff = today.difference(targetDay).inDays;
  final int minuteDiff = now.difference(myDateTime).inMinutes;

  // 5分钟内返回now
  if (minuteDiff <= 5) return 'now';
  // 当日超过5分钟返回Today
  if (dayDiff == 0) return 'Today';
  // 差1天返回yesterday
  if (dayDiff == 1) return 'yesterday';
  // 差2-6天返回对应完整星期名
  if (dayDiff <= 6) return DateFormat.EEEE('en_US').format(myDateTime);
  // 差7天及以上返回原有标准格式
  return DateFormat.yMMMMEEEEd('en_US').format(myDateTime);
}

关键注意点

  • 不要直接用带时分秒的原始时间计算天数差:比如当前是周二00:30,目标时间是周一23:30,两个时间仅差1小时,但实际跨天属于昨日,如果直接用原始时间算difference.inDays会得到0,导致判断错误,对齐到当日0点再计算可以完全避免这个问题。
  • 2-6天的星期名直接调用DateFormat.EEEE('en_US')生成即可,输出的星期格式和你原有yMMMMEEEEd方法里的星期部分完全一致,不需要自己硬编码星期字符串映射表,减少维护成本。
  • 你贴出的原有代码片段多了一个多余的左括号,实际调用时直接传入DateTime实例即可正常运行。

效果验证(以2022年6月21日周二14:00为当前时间)

  • 13:57传入 → 输出now
  • 当日10:00传入 → 输出Today
  • 6月20日任意时间传入 → 输出yesterday
  • 6月19日(周日)传入 → 输出Sunday
  • 6月18日(周六)传入 → 输出Saturday
  • 6月17日(周五)传入 → 输出Friday
  • 6月16日(周四)传入 → 输出Thursday
  • 6月15日(周三)传入 → 输出Wednesday
  • 6月14日及更早时间传入 → 输出对应完整格式,如Tuesday June 14, 2022

内容的提问来源于stack exchange,提问作者Mohammed Hamdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:12:20