2

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

我目前正在编写一个小程序来创建发票。发票应根据物品的存储时间计算,例如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 天(因为发票日期早于一个日期,超过 5 天,因此当月已减去“空闲天数”)

  • 示例 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 天,并且没有一个月前)

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

谢谢你。

4

2 回答 2

2

它只需要几个简单的动作:

DateTime endDate = Min(invoiceDate, endOfStorageDate );    // Min() is pseudo code
int daysInStorage = (endDate - StartInStorageDate).Days;
daysInStorage -= 5;
if (daysInStorage < 0) daysInStorage = 0;
于 2013-05-29T08:01:06.993 回答
0

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

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

double billedDays = Math.Max(0, (invoiceEnd - invoiceStart).TotalDays);
于 2013-05-29T08:48:11.103 回答