C#中两个日期之间的差异

时间:2013-11-20 11:27:06

标签: c#

在Senario中,我需要找出两个日期之间的区别。例如,开始日期是01/01/2012,To Date是01/10/2013。我需要输出为1。9年。

int tDays=(ToDate.Subtract(FromDAte).Days+1);
int years = tDays / 365;
int months = (tDays % 365) / 31;

但是这种计算在闰年的情况下是错误的。

4 个答案:

答案 0 :(得分:8)

我的Noda Time库就是为这类东西而构建的:

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

请注意,这将同时处理月份并不总是相同的事实 - 例如,2013年2月1日至3月1日(28天)== 1个月,而3月第1到 3月29日(也是28天)== 0个月,28天。

这会让你有几个月,几年和几天 - 我不确定你从哪里获得“1.9”,除非你使用“years.months”,我强烈推荐反对因为看起来你的意思是“差不多2年”。

答案 1 :(得分:0)

您应该使用您的约会日期创建一个DateTime对象。然后,您可以创建两个DateTime之间的差异,结果是TimeSpan对象。

答案 2 :(得分:0)

试试这个!

        DateTime date_start = new DateTime(2011, 1, 30);
        DateTime date_end = new DateTime(2012, 2, 29);//leap year

        DateTime tmp_dtStart = date_start;
        DateTime tmp_dtEnd = date_end;

        //FIX FOR LEAP YEAR
        //If the day is the last day of the month just adding 1 day. This might solve the leap year problem.            
        if (tmp_dtStart.Day == DateTime.DaysInMonth(tmp_dtStart.Year, tmp_dtStart.Month))
        {
           tmp_dtStart= tmp_dtStart.AddDays(1);
        }
        if (tmp_dtEnd.Day == DateTime.DaysInMonth(tmp_dtEnd.Year, tmp_dtEnd.Month))
        {
           tmp_dtEnd= tmp_dtEnd.AddDays(1);
        }

        DateTime diff = new DateTime((tmp_dtEnd - tmp_dtStart).Ticks);

        int years = diff.Year - 1;
        int month = diff.Month - 1;

        string outStr = string.Format("{0}.{1} years", years, month);

我已经编辑了以前的代码来处理闰年。

逻辑是,(我使用了2个临时日期变量而没有触及实际的日期变量) 检查当天是否等于该月的最后一天。如果是的话 添加1天,它将移至下个月。

我已经测试了一些正常工作的日期。

答案 3 :(得分:-1)

如果您只需要一个值,则可以使用Ticks属性。例如:

//Calculate Ticks in one year
var now = DateTime.Now;
var ticksInYear = (now.AddYears(1) - now).Ticks;

//Create some dates
DateTime first = DateTime.Today.AddYears(-1);
DateTime second = Datetime.Today;

//Get the difference
long value = (second.Ticks - first.Ticks)/ticksInYear;