计算日,月,年

时间:2010-09-22 06:28:18

标签: c#

如何准确计算日,月,年?

平均值..

从1990年1月2日到2009年5月9日是..

xxx天,xxx个月,xxx年。

知道怎么做吗?

我尝试过Timespan和Tick()..两者都没有这样做..

3 个答案:

答案 0 :(得分:6)

我不认为框架中有任何内容可以做到这一点。 TimeSpan不会这样做,因为天数等取决于确切的起点和终点,而不仅仅是它们之间的持续时间。

这是一种简单的方式,但效率低下:

using System;

class Program
{
    static void Main()
    {
        ShowDifference(new DateTime(1990, 1, 2),
                       new DateTime(2009, 5, 9));
    }

    static void ShowDifference(DateTime start,
                               DateTime end)
    {
        if (start > end)
        {
            throw new ArgumentException();
        }
        // See comment at the end
        int years = end.Year - start.Year - 2;
        while (start.AddYears(years) <= end)
        {
            years++;
        }
        years--;
        Console.WriteLine("{0} years", years);
        start = start.AddYears(years);
        int months = 0;
        while (start.AddMonths(months) <= end)
        {
            months++;
        }
        months--;
        Console.WriteLine("{0} months", months);
        start = start.AddMonths(months);
        int days = 0;
        while (start.AddDays(days) <= end)
        {
            days++;
        }
        days--;
        Console.WriteLine("{0} days", days);
    }
}

显然,有一些方法可以提高效率,但它们会很繁琐。编辑:我已经改变了这一点,开始对这些年份进行非常保守的猜测 - 它可能比它需要的低一个,但我现在不想考虑角落情况。它应该肯定有效,并且循环都有(相当小的)上限,它们将运行的次数。

请注意,在每个步骤中,您应该将完整的年数/天/月添加到起点,而不是一次一个月。否则,如果您从1月30日到3月30日,它将要求2个月和 2天,因为从1月30日到2月28日,当您添加一个月,然后是2月28日到3月28日时你加了第二个月。

希望Noda Time在我最终完成它时会使这一切变得更容易:)

答案 1 :(得分:3)

你不能通过直接计算来做到这一点(即TimeSpan没有“TotalMonths”或“TotalYears”属性,只是因为这些数字在任意时间间隔内没有意义。)

相反,您可以在循环中计算数字,如下所示:

var dt1 = new DateTime(1990, 1, 2);
var dt2 = new DateTime(2009, 5, 9);

int years = 0;
while (dt1.AddYears(1) < dt2)
{
    years ++;
    dt1 = dt1.AddYears(1);
}

int months = 0;
while (dt1.AddMonths(1) < dt2)
{
    months ++;
    dt1 = dt1.AddMonths(1);
}

int days = (int) Math.Floor(dt2.Subtract(dt1).TotalDays);

我没有对此进行测试,因此可能存在一个错误或其他错误,但这是基本想法。

答案 2 :(得分:0)

这样的事情怎么样?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DateTimeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var dt1 = new DateTime(1990, 1, 2);
            var dt2 = new DateTime(2009, 5, 9);

            int days = dt2.Day - dt1.Day;
            int months = dt2.Month - dt1.Month;
            int years = dt2.Year - dt1.Year;

            if (months < 0)
            {
                months += 12;
                years -= 1;
            }
            if (days < 0)
            {
                dt1.AddYears(years);
                dt1.AddMonths(months);
                days = dt2.Subtract(dt1).Days;
                months -= 1;
            }

            Console.WriteLine("{0} Days, {1} Months, {2} Years", days, months, years);
        }
    }
}

输出

7 Days, 4 Months, 19 Years

这是你要找的输出吗?根据您想要定义“月份”的方式,您可能需要一些额外的条件。