2011-07-14 24 views
0

可能重複:
Calculate Years, Months, weeks and Days如何計算年數和月差給出一個開始和結束

如何計算年數和月差給出一個開始和結束日期?

在C#2.0的項目工作,我需要計算年數和月的差給出的開始和結束日期

我在想一個函數像

 public void CalculateYearsAndMonths(DateTime startDate, 
              DateTime endDate, 
              out int years, 
              out int months) 
     { 
      int years=0; 
      int months=0; 

      //???? 
     } 

有什麼建議麼?

+1

相關:http://stackoverflow.com/questions/3286461/how-to-計算,實際的月差日曆年沒有逼近betwe –

回答

2

此代碼的工作,即使兩個日期之間的天數是365天。例如。 1972年2月29日和1973年2月28日,那麼它將返回0年和11個月。

if (endDate < startDate) 
{ 
    DateTime temp = endDate; 
    endDate = startDate; 
    startDate = temp; 
} 

years = endDate.Year - startDate.Year; 
months = endDate.Month - startDate.Month; 
int days = endDate.Day - startDate.Day; 
if (days < 0) months--; 
if (months < 0) 
{ 
    months += 12; 
    years--; 
} 

順便說一句,你需要刪除兩條線,使輸出參數正常工作:

int years=0; 
int months=0; 
+0

謝謝。它看起來像它按預期工作。比看起來複雜一點。 – user9969

0
int years = endDate.Year - startDate.Year; 
int months = endDate.Month - startDate.Month; 

你可以嘗試上面的,應該工作。

+0

謝謝,但我好像還沒有Totalyears – user9969

+0

對不起,我只要一發布了年我記得那是一個擴展類我有,但你可以使用上述獲得年份和月份。 – Jethro

0

這取決於你想怎麼算幾個月甚至幾年。你關心的界限兩者之間的交叉(一月例如,25至2月1日=一個月或12月30日至1月1日= 1年)或約的平均大小的月數/年(如29月份的天或365天)日期?

時間跨度導致您可以通過減去日期會給你所有的固定大小的時間段獲得(例如天,分鐘)

周邊爲什麼幾個月和幾年是很難的一些細節請參見本question

+0

我明白了。不確定要誠實。如果我不在乎界限,你會怎麼做? – user9969

+0

你對跨界或平均期限感興趣嗎? –

+0

順便說一句 - 不知道我得到的投票 - 努力尋找答案,根據需要獲得更多關於這個問題的信息。 –

0

像這樣的事情?

 var end = endDate.Year + endDate.Month/12.0; 
     var start = startDate.Year + startDate.Month/12.0; 

     var years = (int)(end - start); 
     var months = (end - start) * 12; 

不知道,如果你想圓了個...

希望這有助於

約翰

1

我覺得月數是模棱兩可每個月拿到不同的天數。然而,如果基於DateTime.MinValue,您可以像使用:

 TimeSpan difference = endDate - startDate; 

     DateTime age = DateTime.MinValue + difference; 

     // Min value is 01/01/0001 

     int ageInYears = age.Year - 1; 
     int ageInMonths = age.Month - 1; 
     int ageInDays = age.Day - 1; 

     Console.WriteLine("{0}, {1}, {2}", ageInYears, ageInMonths, ageInDays); 
+0

嗨,感謝您的回覆。你能告訴我爲什麼-1?試圖理解你的邏輯。感謝 – user9969

+0

正如你可以看到評論,最小值從01/01/0001開始。應該處理0/0/0來計算總數。而不是DateTime.MinValue,您可以使用'new DateTime(0,0,0)',其中參數按年,月和日排序,並且您不需要減去1. –

相關問題