如何找到两个日期之间的年和月差异?

时间:2011-01-20 14:30:55

标签: c# asp.net

DateTime dayStart;
DateTime dateEnd;

TimeSpan ts = dateEnt - dateStart;

打印:......年份和......月份

我该怎么计算呢?

.net framework 2.0
C#

asp.net项目。

4 个答案:

答案 0 :(得分:7)

来自You should first read this article

Jon Skeet,特别是来自“介绍期间和期间算术”的文字,对您来说很有趣。

因此,您必须定义某个时段是月份,年份等的变化。

Noda-time已经包含了很多功能。但我认为它尚未发布。

答案 1 :(得分:5)

以下将计算年,月,日的年龄

        DateTime dob = "10/18/1981";  // date of birth
        DateTime now = DateTime.Now;

        // Swap them if one is bigger than the other
        if (now < dob)
        {
            DateTime date3 = now;
            now = dob;
            dob = date3;
        }
        TimeSpan ts = now - dob;
        //Debug.WriteLine(ts.TotalDays);

        int years = 0;
        int months = 0, days=0;
        if ((now.Month <= dob.Month) && (now.Day < dob.Day))  // i.e.  now = 03Jan15,  dob = 23dec14  
        {
            // example: March 2010 (3) and January 2011 (1); this should be 10 months.  // 12 - 3 + 1 = 10
            years = now.Year - dob.Year-1;
            months = 12 - dob.Month + now.Month-1;
            days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day;

            if(months==12)
            {
                months=0;
                years +=1;
            }
        }
        else if ((now.Month <= dob.Month) && (now.Day >= dob.Day)) // i.e.  now = 23Jan15,  dob = 20dec14  
        {
            // example: March 2010 (3) and January 2011 (1); this should be 10 months.  // 12 - 3 + 1 = 10
            years = now.Year - dob.Year - 1;
            months = 12 - dob.Month + now.Month;
            days = now.Day - dob.Day;
            if (months == 12)
            {
                months = 0;
                years += 1;
            }
        }
        else if ((now.Month > dob.Month) && (now.Day < dob.Day))  // i.e.  now = 18oct15,  dob = 22feb14  
        {
            years = now.Year - dob.Year;
            months = now.Month - dob.Month-1;
            days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day;
        }
        else if ((now.Month > dob.Month) && (now.Day >= dob.Day))  // i.e.  now = 22oct15,  dob = 18feb14  
        {
            years = now.Year - dob.Year;
            months = now.Month - dob.Month;
            days = now.Day - dob.Day;
        }
        Debug.WriteLine("Years: {0}, Months: {1}, Days: {2}", years, months, days);

答案 2 :(得分:3)

我认为这样的事情会这样做:

  DateTime date1 = new DateTime(1973, 07, 20);
  DateTime date2 = new DateTime(2010, 01, 10);

  // Swap them if one is bigger than the other
  if (date2 < date1)
  {
    DateTime date3 = date2;
    date2 = date1;
    date1 = date3;
  }

  // Now date2 >= date1.

  TimeSpan ts = date2 - date1;

  // Total days
  Console.WriteLine(ts.TotalDays);

  // Total years
  int years = date2.Year - date1.Year;

  int months = 0;
  // Total monts
  if (date2.Month < date1.Month)
  {
    // example: March 2010 (3) and January 2011 (1); this should be 10 monts
    // 12 - 3 + 1 = 10
    // Take the 12 months of a year into account
    months = 12 - date1.Month + date2.Month;
  }
  else
  {
    months = date2.Month - date1.Month;
  }
  Console.WriteLine("Years: {0}, Months: {1}", years, months);

编辑澄清:不需要复杂的日期算法或任何类型的东西,因为一年中总有12个月(至少在我们的日历中)。

答案 3 :(得分:3)

这取决于你想要准确计算的内容。

您无法将TimeSpan中的值转换为确切的年份和月份,因为年份和月份的长度会有所不同。您可以像这样计算大概的年份和月份:

int years = ts.Days / 365;
int months = (ts.Days % 365) / 31;

如果您想要精确的差异,则必须比较DateTime值。