2013-12-19 131 views
1

我试图做的是计算两个日期之间的年,月和日的数量。 不幸的是,.NET框架没有可以做到这一点的方法。错误地计算两个日期之间的年/月/日

我所做的基本上是以下几点: http://www.codeproject.com/Articles/28837/Calculating-Duration-Between-Two-Dates-in-Years-Mo

从的评论数改编说网站:

var monthDay = new[] { 31, 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 

DayCalculation:

if (fromDate.Day > toDate.Day) 
{ 
    increment = monthDay[toDate.Month - 1]; 
} 

if (increment == -1) 
{ 
    increment = DateTime.IsLeapYear(toDate.Year) ? 29 : 28; 
} 

所以,我有以下作用:

日期1:1979年1月30日

日期2:2013-03-01

,输出是:34岁1个月,-1

预期的输出是:34年,1个月,1天

这种效应每次都会发生,Date2是3月的日期。

你知道这个计算有什么问题吗? 或者你知道更好的解决方案如何实现预期的效果?

在此先感谢

PS:我知道,你可以计算两个日期之间的天量,但我需要的是成品多年的量,成品几个月的量和成品天量

回答

8

不幸的是,没有.NET框架的方法可以做到这一点。

没错,但有Noda Time代替:)(这是我的Joda Time到.NET端口,虽然有两个项目之间有不少分歧。)

LocalDate start = new LocalDate(1979, 1, 30); 
LocalDate end = new LocalDate(2013, 3, 1); 
Period period = Period.Between(start, end); 
Console.WriteLine("{0} years, {1} months, {2} days", 
        period.Years, period.Months, period.Days); 

输出:

34 years, 1 months, 1 days 
+0

我刚用诺达时间测试了我的测试箱,它的功能就像一个魅力!非常感谢你,没有意识到这个伟大的框架:-) – user3092518

+0

嘿乔恩我没有发现任何关于诺达时间在您的网站上的授权......是一个允许在商业项目中使用野田时间或在那里任何限制?在此先感谢 – user3092518

+0

@ user3092518:它位于Apache许可证下 - 在网站上搜索“许可证”以获取许可证详细信息的链接。 –

0

这是一种不使用外部库的情况下计算差异的方法。需要两个日期。我假定第一个日期不晚于第二个日期。否则,您将不得不交换它们以进行正确的计算。

var first = new DateTime(1979, 1, 30); 
var second = new DateTime(2013, 3, 1); 

以下是如何计算差异。您不需要一张表来获取当月的天数。该信息由DateTime.DaysInMonth函数提供。

var years = second.Year - first.Year; 
var months = second.Month - first.Month; 
if (months < 0) { 
    months += 12; 
    years -= 1; 
} 
var days = second.Day - first.Day; 
if (days < 0) { 
    var daysInFirstMonth = DateTime.DaysInMonth(first.Year, first.Month); 
    days += daysInFirstMonth; 
    months -= 1; 
} 

打印计算值

Console.WriteLine("{0} year(s), {1} month(s), {2} day(s)", years, months, days); 

将导致

 
34 year(s), 1 month(s), 2 day(s) 

这将产生相同的结果,你已经链接到代码。但是,您希望获得1天而不是2天。我想这取决于你如何定义“天之间”。如果您希望只计算1月31日,那么您可以从days减1。那么相邻两天之间会有0天,“同一天之间”会有-1天。

+1

野田时间至少产生34年,1个月,1天的原因是,增加34年后,你将达到2013年1月30日;加1个月后你会到2013-02-28,然后加1天后你会到2013-03-01。 2天在这里工作并不是很清楚。 –

相关问题