在C#中计算考虑30天月份的天数

时间:2017-06-12 13:31:47

标签: c# .net date calendar

我试图编写一个计算每月账单金额的程序。考虑30/360模型。即用于开发票的金额基于30天的月份,无论月份是28天,30天还是31天。我计算开始日期(会员注册日期)到结束日期(会员退出的日期)之间的天数。每天的费用是25美元这是一个小表格,例如:

**日期为(MM / DD)。

  

开始日期|结束日期|天数|总金额

     

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

     

05/10 | 05/31 | 22 | ($三十〇分之二十五)* 22 = 18.33

     

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

     

05/01 | 05/12 | 12 | ($三十〇分之二十五)* 12 = 10

     

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

     

第3行的预期结果=($ 25/30)* 22 = 18.33

     

当前结果=($ 25/30)* 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日期间的费用。其余时间的计费发生在六月周期等等

4 个答案:

答案 0 :(得分:1)

我运行了你的代码,它实际上是31天。 用:

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

http://rextester.com/IKE75462

正如上面的评论中提到的,如果你试图从5月10日到5月31日找到它也是对的,它的22天

答案 1 :(得分: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天。

答案 2 :(得分: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;

答案 3 :(得分:0)

public static int GetDays(DateTime start, DateTime end) {
    int newDaysDiff = ((360 * (end.Year - start.Year)) + (30 * ((end.Month - start.Month) == 0 ? 0 : (end.Month - start.Month) - 1)));
    int j = 0;
    if (start.Month == end.Month && start.Year == end.Year) {
        if (start.Day == 1 && end.Day == 31) {
            j = (end.Day - start.Day);
        }
        else {
            j = (end.Day - start.Day) + 1;
        }
    }
    else {
        if (start.Day == 1) {
            j = j + 30;
        }
        else {
            j = j + DateTime.DaysInMonth(start.Year, start.Month) - start.Day + 1;
        }
        if (end.Day == 30 || end.Day == 31) {
            j = j + 30;
        }
        else {
            j = j + end.Day;
        }
    }
    newDaysDiff = newDaysDiff + j;
    return newDaysDiff;
}