我试图编写一个计算每月账单金额的程序。考虑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日期间的费用。其余时间的计费发生在六月周期等等
答案 0 :(得分:1)
我运行了你的代码,它实际上是31天。 用:
var start = new DateTime(2016, 05, 10);
var finish = new DateTime(2016, 06, 10);
正如上面的评论中提到的,如果你试图从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;
}