2016-05-13 144 views
0

我正在尋找一種方法來計算兩個日期之間每個月的30天之間的天數(即使在二月,在31月)。計算兩個日期之間的所有月份= 30天的數字

在SQL中有一些解決方案,但如果可能的話,我正在尋找c#中的解決方案。 有什麼想法嗎?

實施例:(DATE US)

2016年1月1日到2016年5月31日= 150天,而不是150

,因爲在這種情況下5一個月,所以5 * 30 = 150. 所有月份都基於我的情況30天。

其它示例:

從2016年1月16日到2016年7月17日182 =代替的183(15 + 30 + 30 + 30 + 30 + 30 + 17)

+2

看起來很奇怪,爲什麼你想挑戰的日曆,使所有個月30天?添加更多關於你想要達到的細節將有助於理解它。 –

+0

您可以獲取DateTime對象的月份編號,該對象將返回1到12之間的數字。如果您計算11月至2月的月份,則可能還需要查看年份。 – jdweng

+2

有這麼多的特例要考慮,沒有希望以明智的方式回答這個問題。至少爲你能想到的角落案例提供一些輸入和預期輸出。 – hvd

回答

0

試這個代碼

var months = endDate.Month - startDate.Month - 1; 
var startDateDayes = 30 - startDate.Day; 
startDateDayes =startDateDayes ==-1 ? 0 : startDateDayes;//for 31 month days 
var endDateDayes = endDate.Day; 
var totalDays = startDateDayes + endDateDayes + months * 30; 
if (endDate.Year > startDate.Year) 
{ 
    totalDays += 360 * (endDate.Year - startDate.Year); 
} 

希望它有助於

1

什麼你正在試圖做的似乎是用於金融市場相同的日曆。下面是實現30E/360 ISDA計算方法,因爲它是在他們在其網站上提供demo XLS實施的解決方案(30/360天數計算慣例):

var start = new DateTime(2016, 1, 1); 
var finish = new DateTime(2016, 05, 31); 


var d1 = start.Day == 31 ? 30 : start.Day; 
var d2 = finish.Day == 31 && (start.Day == 30 || start.Day == 31) ? 30 : finish.Day; 
// actualDaysDiff will be 151 as expected 
var actualDaysDiff = (finish - start).TotalDays; 
// using the new method newDaysDiff will be 150 
int newDaysDiff = ((360 * (finish.Year - start.Year)) + (30 * (finish.Month - start.Month)) + (d2 - d1)); 

我得到您的其他例子正確的結果(其中,我認爲,應該是181天)。

有關此主題的檢查的詳細信息如下:

  1. 360-day calendar
  2. C# for Financial Markets
相關問題