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
相关产品推荐
相关产品推荐

