两个日期之间的月差异

时间:2015-01-07 17:55:29

标签: c# datetime

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

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

4 个答案:

答案 0 :(得分:3)

不要直接比较Month个变量,因为它会在月份数量和#34;包装变量时中断。正如你所注意到的那样。

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

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

TimeSpan并未考虑Months,因此您必须定义平均天数才能检查过去几个月的数字。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

这是一个太晚的答案,因为我检查的人都没有像TimeSpan.TotalDays这样的月份的确切分数,所以没有答案。

例如20-01-202120-03-2021之间的总月数是什么? 我猜应该是2.0xx,但是如果您将Feb视为30天,则会得到一个不同的答案“ 1.8xx或类似内容”

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

  • 首先,我获得了选定的两个日期之间的天数列表,如@mqp answer
  • 然后我按月将它们分组并进行了计算

代码:

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;
}