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

Flutter中如何计算当前日期与API返回日期的相差月数及天数

Dart 计算游轮预订剩余月数、天数方案

原有代码问题

  • 未考虑跨年场景,直接对月份数值做减法会得到错误的月份差
  • 固定按每月30天折算天数,忽略了不同月份实际天数差异、闰年等情况,误差很高
  • 月份差计算逻辑颠倒,未来日期的月份数值可能小于当前月(比如当前12月,目标次年2月),直接用当前月减目标月会得到负数

修正后实现代码

// 传入API返回的日期字符串即可调用
Map<String, int> calculateRemainingTime(String apiDateStr) {
  final DateTime now = DateTime.now().toUtc();
  final DateTime targetDate = DateTime.parse(apiDateStr).toUtc();
  
  // 处理目标日期已过期的情况
  if (targetDate.isBefore(now)) {
    return {'months': 0, 'days': 0};
  }

  int yearDiff = targetDate.year - now.year;
  int monthDiff = targetDate.month - now.month;
  int dayDiff = targetDate.day - now.day;

  // 天数为负时,借上个月的天数补足
  if (dayDiff < 0) {
    monthDiff -= 1;
    // 计算当前日期到最近一个整月之间的实际天数
    DateTime lastMonth = DateTime(targetDate.year, targetDate.month, 0);
    dayDiff += lastMonth.day;
  }

  // 月份为负时,借年补足
  if (monthDiff < 0) {
    yearDiff -= 1;
    monthDiff += 12;
  }

  // 总月份差 = 年折算的月份 + 剩余月份差
  int totalMonths = yearDiff * 12 + monthDiff;

  return {'months': totalMonths, 'days': dayDiff};
}

使用示例

var remaining = calculateRemainingTime("2021-10-05T16:30:00Z");
print("剩余${remaining['months']}个月零${remaining['days']}天");

内容的提问来源于stack exchange,提问作者Vinay Bakle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:30:04