2 个日期之间的月差

本文关键字:之间 日期 | 更新日期: 2023-09-27 18:36:33

我正在尝试计算一个日期列和今天之间的月份差异。我们在 csharp 中是否有任何方法,例如 monthdiff 或 datediff 来实现此功能?我的代码问题是,如果提交日期年份不同,那么它就会中断。

bool isDateAccepted = ((SubmissionDate.Month - DateTime.Now.Month) < 6)

2 个日期之间的月差

您始终可以在提交日期中添加 6 个月,并将其与当前日期进行比较。

bool isDateAccepted = (submissionDate.AddMonths(6) > DateTime.Now);

不要直接比较Month变量,因为正如您所注意到的那样,当月份数字"换行"时,它会中断。

相反,减去DateTime对象以获得TimeSpan然后使用该TotalDays属性:

bool isDateAccepted = ((SubmissionDate - DateTime.Now).TotalDays < 6 * 30)

TimeSpan不考虑Months,所以你必须定义一个平均天数,以便检查过去几个月的数字。

您可以计算总月数并减去它们:

public int MonthDifference(Date a, Date b)
{
   int totalMonthsA = a.Year*12 + a.Month;
   int totalMonthsB = b.Year*12 + b.Month;
   return totalMonthsA - totalMonthsB;
}

这是一个为时已晚的答案,当我检查时,没有人回答月份的确切分数,例如我们在TimeSpan.TotalDays中的情况。

例如,20-01-202120-03-2021 之间的总月数的结果是什么?我想应该是2.0xx,但如果你认为 2 月是 30 天,你会得到不同的答案"1.8xx什么的"

因此,我根据所选日期之间每个月中的天数进行了计算。

  • 首先,我得到了所选两个日期之间的天数列表@mqp如答案所示
  • 然后我按月对它们进行分组并进行了计算

代码:

public static double GetTotalMonths(this DateTimeOffset firstDate, DateTimeOffset thru)
{
    var days = firstDate.EachDayTill(thru).ToList();
    return days.GroupBy(d => new {d.Month, d.Year,})
        .Sum(g => (g.Count() * 1.00) / (DateTime.DaysInMonth(g.Key.Year, g.Key.Month) * 1.00));
}

public static IEnumerable<DateTimeOffset> EachDayTill(this DateTimeOffset from, DateTimeOffset thru)
{
    for (var day = new DateTimeOffset(from.Date, TimeSpan.Zero); day.Date <= thru.Date; day = day.AddDays(1))
        yield return day;
}