日期的计算算法

时间:2013-05-29 07:53:37

标签: c# date datetime date-arithmetic

我之前发过这个问题。但是我不够具体,所以我想在这篇文章中更好地解释它。

我目前正在编写一个小程序来创建发票。发票应根据商品的存储时间计算,例如costPerDay * numberOfDaysInStorage

发票每月创建,例如InvoiceDate = 31/05/2013.

从数据库中提取项目开始日期和结束日期(存储中)。

所以,我有:

变量:

 DateTime StartInStorageDate; 
 DateTime EndOfStorageDate;
 DateTime InvoiceDate; //(always last date of month)

规则

  • 存储的前五天应该是免费的。
  • 只应针对给定的发票日期计算天数。
  • 如果存在InvoiceDate之前的日期,则应采用日期 考虑到,为了计算“自由日”。如果之前的月份日期有5天或更多天,到月末,我们必须假设已经计算了这些日期,因此在发票月份不考虑它们。

实施例

  • 示例1:

    DateTime StartInStorageDate = 07/04/2013;

    DateTime EndOfStorageDate = 08/06/2013;

    DateTime InvoiceDate = 31/05/2013;

    天数= 31天的计算(因为发票日期有一个日期,超过五天,“免费日”已经 在那个月减去)

  • 示例2:

    DateTime StartInStorageDate = 28/04/2013

    DateTime EndOfStorageDate = 08/06/2013

    DateTime InvoiceDate = 31/05/2013

    天数的计算=(总共11天 - 5天“自由日”)= 6天 (因为发票日期有一个日期之前,没有5天到 在这个月末,我们必须将这几天添加到发票月份,并且 从总数中减去5“自由日”

  • 示例3:

    DateTime StartInStorageDate = 28/04/2013

    DateTime EndOfStorageDate = 08/05/2013

    DateTime InvoiceDate = 31/04/2013

    天数的计算= 0(因为invoiceDate的时间不超过5天,并且没有一个月前)

我希望有人可以提供一些指示,或者一些代码来帮助计算天数。我觉得棘手的部分是从发票日期“调查”前一个月(如果存在),检查几天。

谢谢。

2 个答案:

答案 0 :(得分:2)

只需要几个简单的操作:

DateTime endDate = Min(invoiceDate, endOfStorageDate );    // Min() is pseudo code
int daysInStorage = (endDate - StartInStorageDate).Days;
daysInStorage -= 5;
if (daysInStorage < 0) daysInStorage = 0;

答案 1 :(得分:0)

您需要计算两个日期:发票期间的开始和结束时间:

DateTime invoiceStart = StartInStorageDate.AddDays(5);
DateTime invoiceEnd = InvoiceDate < EndOfStorageDate ? InvoiceDate : EndOfStorageDate; 

double billedDays = Math.Max(0, (invoiceEnd - invoiceStart).TotalDays);