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

Flutter中如何计算并显示指定日期的流逝时间(含年月周日时分秒)

Flutter实现指定日期以来的多维度流逝时间计算与展示

核心思路

要实现覆盖年、月、周、日、时、分、秒的流逝时间计算,同时满足4周自动转换为1个月的规则,需要分步骤处理日期差(年、月、天)、周数转换,最后计算精确的时分秒。由于月份和年份是不规则的(不同月份天数不同),不能直接用Duration类计算,需手动处理日期逻辑。

完整实现代码

1. 时间计算工具类

class ElapsedTimeCalculator {
  // 计算从指定日期到现在的各维度流逝时间
  static Map<String, int> calculate(DateTime startDate) {
    final now = DateTime.now();
    int years = now.year - startDate.year;
    int months = now.month - startDate.month;
    int days = 0;

    // 调整月份与年份:处理跨年月的情况
    if (months < 0) {
      years--;
      months += 12;
    }
    // 处理当月日期未达起始日的情况(比如起始日16号,当前15号,不算满1个月)
    if (now.day < startDate.day) {
      months--;
      if (months < 0) {
        years--;
        months += 12;
      }
    }

    // 计算扣除年、月后的剩余天数
    DateTime adjustedStart = DateTime(startDate.year + years, startDate.month + months, startDate.day);
    days = now.difference(adjustedStart).inDays;
    // 若调整后的起始日期晚于当前时间,再次修正月份
    if (days < 0) {
      months--;
      if (months < 0) {
        years--;
        months += 12;
      }
      adjustedStart = DateTime(startDate.year + years, startDate.month + months, startDate.day);
      days = now.difference(adjustedStart).inDays;
    }

    // 处理周数转月份的规则:每4周算1个月
    int weeks = days ~/ 7;
    int remainingDays = days % 7;
    while (weeks >= 4) {
      months += 1;
      weeks -= 4;
      // 月份超过12时自动转年
      if (months >= 12) {
        years += months ~/ 12;
        months = months % 12;
      }
    }

    // 计算剩余的时、分、秒
    final remainingTime = now.difference(adjustedStart.add(Duration(days: days)));
    final hours = remainingTime.inHours;
    final minutes = remainingTime.inMinutes.remainder(60);
    final seconds = remainingTime.inSeconds.remainder(60);

    return {
      'years': years,
      'months': months,
      'weeks': weeks,
      'days': remainingDays,
      'hours': hours,
      'minutes': minutes,
      'seconds': seconds,
    };
  }

  // 将计算结果格式化为展示字符串
  static String format(Map<String, int> elapsedData) {
    return '${elapsedData['years']}年 ${elapsedData['months']}月 ${elapsedData['weeks']}周 ${elapsedData['days']}天 ${elapsedData['hours']}时 ${elapsedData['minutes']}分 ${elapsedData['seconds']}秒';
  }
}

2. 使用示例

void main() {
  // 指定起始日期
  final startDate = DateTime(2023, 5, 16);
  // 计算流逝时间
  final elapsed = ElapsedTimeCalculator.calculate(startDate);
  // 格式化输出
  print(ElapsedTimeCalculator.format(elapsed));
}

关键细节说明

  • 自然月计算:基于实际月份的天数判断是否满1个月,而非固定按30天计算,更符合日常认知。
  • 4周转月规则:通过循环处理周数,每累计4周就转换为1个月,同时自动处理月份跨年的情况。
  • 实时时分秒:利用Duration计算扣除天之后的精确时分秒,若要动态展示流逝时间,可通过Timer.periodic每秒更新一次计算结果。

内容的提问来源于stack exchange,提问作者Mateusz Ptak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:27:18