2013-05-29 3 views
2

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

В настоящее время я пишу небольшую программу для создания счетов-фактур. Счета-фактуры должны рассчитываться с учетом времени хранения элементов, например. costPerDay * numberOfDaysInStorage.

Счет-фактура создается ежемесячно, например. InvoiceDate = 31/05/2013.

Дата начала и конечная дата элементов (в хранилище) извлекаются из базы данных.

Итак, у меня есть:

Переменные:

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

Правила

  • Первые пять дней хранения всегда должны быть свободными.
  • Расчет дней должен производиться только за данную дату выставления счета.
  • Если дата, предшествующая InvoiceDate, существует, дни должны быть приняты , чтобы рассчитать «свободные дни». Если в течение месяца или более дней, до конца месяца, мы должны предположить, что они были рассчитаны и, следовательно, не учитывают их в счете-фактуре.

Примеры

  • Пример 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 дней, а не за месяц до)

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

спасибо.

+1

Не совсем уверен, что вы хотите сделать, но похоже, что вы должны взглянуть на [TimeSpan] (http://msdn.microsoft.com/library/system.timespan.aspx) – Corak

ответ

0

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

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

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

Спасибо. Работает отлично .. – MartinChristensen

2

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

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

Для 'Min' я бы сделал что-то вроде этого:' DateTime endDate = new DateTime (Math.Min (invoiceDate.Ticks, endOfStorageDate.Ticks)); ' –

+0

Или просто' DateTime endDate = invoiceDate Corak

+0

Спасибо за ваш ответ и ваше время. Очень признателен. – MartinChristensen

Смежные вопросы