Алгоритм расчета дат

Я уже публиковал этот вопрос. Однако я не был достаточно конкретным, поэтому я пытаюсь объяснить это лучше в этом посте.

В настоящее время я пишу небольшую программу для создания счетов-фактур. Счета-фактуры должны рассчитываться с учетом времени хранения предметов, например. 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 дней и нет предыдущего месяца)

Я надеюсь, что кто-то может дать мне несколько указателей или какой-нибудь код, чтобы помочь рассчитать дни. Часть, которую я нахожу сложной, заключается в том, чтобы «заглянуть» в предыдущий месяц (если он существует) с даты счета-фактуры, чтобы проверить количество дней.

Спасибо.


person MartinChristensen    schedule 29.05.2013    source источник
comment
Не совсем уверен, что вы хотите сделать, но, похоже, вам следует взглянуть на TimeSpan   -  person Corak    schedule 29.05.2013


Ответы (2)


Вам необходимо рассчитать две даты: начало и конец расчетного периода:

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

double billedDays = Math.Max(0, (invoiceEnd - invoiceStart).TotalDays);
person Daan    schedule 29.05.2013

Для этого требуется всего несколько простых действий:

DateTime endDate = Min(invoiceDate, endOfStorageDate );    // Min() is pseudo code
int daysInStorage = (endDate - StartInStorageDate).Days;
daysInStorage -= 5;
if (daysInStorage < 0) daysInStorage = 0;
person Henk Holterman    schedule 29.05.2013
comment
Для Min я бы сделал что-то вроде этого: DateTime endDate = new DateTime(Math.Min(invoiceDate.Ticks, endOfStorageDate.Ticks)); - person It'sNotALie.; 29.05.2013
comment
Или просто DateTime endDate = invoiceDate < endOfStorageDate ? invoiceDate : endOfStorageDate; - person Corak; 29.05.2013
comment
Спасибо за ваш ответ и ваше время. Очень признателен. - person MartinChristensen; 29.05.2013