Flutter:找出两个日期之间的年,月,包括闰年的差异

hk8txs48  于 2023-03-13  发布在  Flutter
关注(0)|答案(2)|浏览(282)

我正在flutter中开发一个应用程序,我必须获得年、月日期中两个日期之间的差值

如下例

最终日期1 =日期时间(2019年10月15日);
最终日期2 =日期时间(2020年12月20日);

答案差值= 1年2个月5天

我搜索了很多,但不幸的是没有得到一个适当的解决方案来计算两个日期之间的差异年,月包括闰年。

**注意:**我知道如何获得两个日期之间的天数差,即

final _bd = DateTime(2020, 10, 12);
 final _date = DateTime.now();
 final _difference = _date.difference(_bd).inDays;
cunj1qz1

cunj1qz11#

您可以根据需要定制以下代码,以返回字符串或对象,或使其成为扩展:

void getDiffYMD(DateTime then, DateTime now) {
  int years = now.year - then.year;
  int months = now.month - then.month;
  int days = now.day - then.day;
  if (months < 0 || (months == 0 && days < 0)) {
    years--;
    months += (days < 0 ? 11 : 12);
  }
  if (days < 0) {
    final monthAgo = DateTime(now.year, now.month - 1, then.day);
    days = now.difference(monthAgo).inDays + 1;
  }

  print('$years years $months months $days days');
}
xlpyo6sf

xlpyo6sf2#

答案可能有点长,但会给予你你需要的。
这将以字符串形式给予值,格式为“Year:年、月:月,天:天”。您可以根据需要更改。
您需要调用differenceInYearsMonthsAndDays()并传递开始日期和结束日期。
一个扩展,用于计算以月为单位的差值,并丢弃多余的天数。

extension DateTimeUtils on DateTime {
  int differenceInMonths(DateTime other) {
    if (isAfter(other)) {
      if (year > other.year) {
        if (day >= other.day) {
          return (12 + month) - other.month;
        } else {
          return (12 + month - 1) - other.month;
        }
      } else {
        if (day >= other.day) {
          return month - other.month;
        } else {
          return month - 1 - other.month;
        }
      }
    } else {
      return 0;
    }
  }
}

一种生成年、月、日格式的方法

String differenceInYearsMonthsAndDays(
  DateTime startDate,
  DateTime endDate,
) {
  int days;
  final newStartDate = startDate.add(const Duration(days: -1));
  int months = endDate.differenceInMonths(newStartDate);
  if(months >= 12) {
    final years = months ~/ 12;
    final differenceInMonthsAndDays = differenceInMonthsAndDays(
          startDate.add(const Duration(year: years), 
          endDate,
    );
    return "Years : years, $differenceInMonthsAndDays";
  } else {
    return differenceInMonthsAndDays(
          startDate, 
          endDate,
    );
  }

}

一种生成月、日格式的方法

String differenceInMonthsAndDays(
  DateTime startDate,
  DateTime endDate,
) {
  int days;
  final newStartDate = startDate.add(const Duration(days: -1));
  int months = endDate.differenceInMonths(newStartDate);

  if (months > 0) {
    final tempDate = DateTime(
      newStartDate.year,
      newStartDate.month + months,
      newStartDate.day,
    );
    days = endDate.difference(tempDate).inDays;
    return days > 0 
       ? "Months : $months, Days : $days" 
       : "Months : $months";
  } else {
    days = endDate.difference(newStartDate).inDays;
    return "Days : $days";
  }
}

相关问题