2013-11-20 42 views
1

在senario中我需要找出兩個日期之間的差異。例如開始日期是01/01/2012和To Date是01/10/2013。我需要得到的輸出爲1.9年。在C#中的兩個日期之間的差異#

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

但是這種計算在閏年的情況下是錯誤的。

+3

您忘記了'c#-5.0'標籤。 –

+0

你的年數是一個整數。你不能得到小數點 –

+0

通過'1.9'你的意思是你想格式化結果爲'{year}。{month}'? –

回答

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); 

注意,這將交易的事實是,幾個月並不總是相同的長度 - 因此,例如,2月1日到2013年3月1日(28天)== 1個月,而3月1日到 3月29日(也是28天)== 0個月,28天。

這會讓你幾個月,幾年和幾天 - 根據你的例子,我不確定你從哪裏得到「1.9」,除非你使用「years.months」,我強烈建議反對,因爲它看起來像你的意思是「近2年」。

+1

我還沒有使用過NodaTime,你能解釋一下,這與僅僅去'TimeSpan diff = ToDate - FromDate'有何不同,然後以你想要的任何形式打印TimeSpan? NodaTime只是「更好看」還是有功能差異? – Tobberoth

+4

@Tobberoth:不,這是一個非常實用的區別:'TimeSpan'只是*一些刻度。這意味着它不能把它分成「幾個月」,因爲它不知道我們正在討論哪個月,等等。同樣的'TimeSpan'可能代表1個月,或者1個月和3天,這是因爲那個月的方式長度不一。 Noda Time中的'Period'類型是爲日曆算術而設計的,而不僅僅是一個與日曆無關的「這個多點滴答已經過去」。 (我們有一個不同的類型 - 「持續時間」 - 對於這個概念。) –

+0

我明白了,這很酷。 – Tobberoth

0

您應該創建一個DateTime對象與您的關於日期。然後您可以創建兩個DateTime之間的差異,結果是一個TimeSpan對象。

+0

他已經有'DateTime'值:'FromDate'和'ToDate'。 –

-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; 
+0

這與這個問題有什麼關係? –

+0

@Panagiotis Kanavos對不起,錯過了這個問題。糾正。 – kravasb

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,並且移動到下個月。

我測試了很少的日期,它工作正常。

+0

這並沒有考慮閏年 –

+0

或者月份長短不一。 –

+0

我對閏年進行了一些更改。 – Sid