计算日,月,年

如何计算日,月,年?

手段..

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

xxx天,xxx个月,xxx年。

知道怎么做吗?

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

你不能通过直接计算来做到这一点(即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); 

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

我不认为框架中有任何内容可以做到这一点。 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将使这一切变得更容易:)

这样的事怎么样?

 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 

那是你要找的输出吗? 根据您希望如何定义“月份”,您可能需要一些额外的条件。