2017-06-12 116 views
2

我正試圖編寫一個程序來計算每個月的賬單金額。考慮到30/360模型。即用於開票的金額基於30天的月份,無論月份是28,30或31天。我正在計算開始日期(成員註冊日期)到結束日期(成員退出日期)之間的天數。每天的費用是25美元這裏是一個小表,例如:在C#中考慮30天月份的天數計算

**日期在(MM/DD)。

開始日期|結束日期|天數|總金額

05/01 | 05/31 | 30 | ($ 25/30)* 30 = 25

05/10 | 05/31 | 22 | ($ 25/30)* 22 = 18.33

05/10 | 06/10 | 22 | ($ 25/30)* 22 = 18.33

05/01 | 05/12 | 12 | ($ 25/30)* 12 = 10

05/06 | 05/15 | 10 | ($三十〇分之二十五)* 10 = 8.33

用於行3 =($三十〇分之二十五)預期的結果* 22 = 18.33

當前結果=($三十〇分之二十五)* 31 = 25.83

使用下面的代碼,除了突出顯示的情況外,我能夠按預期得到結果。我如何在月底前進行限制計算?我的意思是如果開始日期是05/10和結束日期是06/10,則根據天數(22)計算到05/31。

public static void Main(string[] args) 
    { 
     var start = new DateTime(2016, 05, 10); 
     var finish = new DateTime(2016, 05, 28); 

     var date1 = start.Day == 31 ? 30 : start.Day; 
     var date2 = finish.Day == 31 && (start.Day == 30 || start.Day == 31) ? 30 : finish.Day; 

     var actualDaysDiff = (finish - start).TotalDays; 
     int newDaysDiff = ((360 * (finish.Year - start.Year)) + (30 * (finish.Month - start.Month)) + (date2 - date1))+1; 

     Console.WriteLine("The number of days are "+ newDaysDiff); 

     float invoiceAmount = 0; 
     invoiceAmount = (float)(25.0/30)*newDaysDiff; 

     Console.WriteLine("Total Invoice for this month : "+ invoiceAmount); 

    }  

例如:我不想計算開始日期和結束日期之間的天數。我想計算從特定月份的開始日期到結束的總費用。如果客戶在5月10日訂閱產品並在6月10日結束訂閱。費用按月收費。因此,客戶是通過計算5月10日至5月31日的成本計算的。其餘的日子計費發生在6月週期等等

+2

你應該指定一個25就是要 –

+0

金額所以問題是,你沒有得到天的時候開始的正確量是05/10和結束是06/10? –

+0

我不明白。如果結束日期在另一個月內,您希望計算到開始日期的月份結束? –

回答

1

如果我瞭解你的要求,你只需要計算開始日期月的金額。然後下面應該工作,這也是更簡單,更簡潔:

int startDateDays = DateTime.DaysInMonth(start.Year, start.Month); 
if (finish.Month != start.Month || finish.Year != start.Year) 
    finish = new DateTime(start.Year, start.Month, startDateDays); 
int newDaysDiff = (finish - start).Days + 1; 
if (newDaysDiff >= startDateDays) 
    newDaysDiff = 30; 

float invoiceAmount = (float)(25.0/30) * newDaysDiff; 

用這種方法你突出顯示的行是一個整月將被視爲22天。

+0

Tim你真棒!非常感謝它的工作:) – shockwave

1

我跑你的代碼,它實際上說它的31天。 有:

var start = new DateTime(2016, 05, 10);  
var finish = new DateTime(2016, 06, 10); 

http://rextester.com/IKE75462

在評論中提到上述,如果你想從5/10到5/31 it's找到

也是正確的,其22天

+0

加布裏 - 我不想計算起始日期和結束日期之間的天數。我想計算從特定月份的開始日期到結束的總費用。如果客戶在5月10日訂閱產品並在6月10日結束訂閱。費用按月收費。因此,客戶是通過計算5月10日至5月31日的成本計算的。其餘日子的計費發生在六月週期等等。 – shockwave

+0

好吧,我現在明白了,請更新你的問題來幫助我們解決這個問題 –

0

你可以用這個來計算兩個日期之間

佔全天
var start = new DateTime(2016, 05, 01); 
var finish = new DateTime(2016, 05, 31); 

var daysBetween = (finish - start).TotalDays + 1; 
daysBetween = daysBetween > 30 ? 30 : daysBetween;