Я пишу здесь какой-то производственный код, и мне нужно добавить код моего собственного дизайна поверх кода, который уже немного проблематичен. У меня есть цикл, который помогает вычислять даты на основе определенного периода оплаты.Добавление дней на C# Неверный объект DateTime, который не выполняется во время цикла
Проблема, с которой я сталкиваюсь, заключается в том, что мои объекты Nullable DateTime
вообще не меняются при добавлении к ним значений с помощью вызова функции DateTime?.Value.AddDays()
. Когда я просматриваю этот код, объект nextPayDate
и его значение остаются неизменными, хотя я добавляю к нему во время цикла. Указанное поведение не полезно, а также создает бесконечный цикл. Мысли?
public static List<DateTime?> GetLPSPaymentDates(Applicant applicant, int loanTermType, DateTime deliveryConfirmationDate)
{
if (applicant == null)
{
throw new Exception("The applicant you are wanting to set an LPS for is null");
}
DateTime? firstPaymentDate = DateTime.Today;
DateTime? secondPaymentDate = DateTime.Today;
DateTime? lastPayDate = applicant.MainEmployer.LastPayDate;
DateTime? nextPayDate = applicant.MainEmployer.NextPayDate;
DateTime? earliestPossiblePaymentDate = deliveryConfirmationDate.AddDays(10);
int daysToAdd = 0;
if (lastPayDate != null && nextPayDate != null)
{
var tempDate = nextPayDate;
while (tempDate.Value <= earliestPossiblePaymentDate.Value)
{
daysToAdd = IncrementPaymentDateByTermType((TermTypes)loanTermType);
nextPayDate.Value.AddDays(daysToAdd);
firstPaymentDate.Value.AddDays(daysToAdd);
}
if (firstPaymentDate == DateTime.Today)
{
firstPaymentDate = nextPayDate;
}
secondPaymentDate = firstPaymentDate.Value.AddDays(daysToAdd);
}
else
{
throw new Exception("Could not find applicant's last or next pay date.");
}
List<DateTime?> firstAndSecondDates = new List<DateTime?>()
{
firstPaymentDate,
secondPaymentDate
};
return firstAndSecondDates;
}
public static int IncrementPaymentDateByTermType(TermTypes termType)
{
int numberOfDaysToAdd;
switch (termType)
{
case TermTypes.BiWeekly:
numberOfDaysToAdd = 14;
break;
case TermTypes.Weekly:
numberOfDaysToAdd = 7;
break;
default:
numberOfDaysToAdd = 1;
break;
}
return numberOfDaysToAdd;
}
'nextPayDate.Value.AddDays (daysToAdd);' AddDays возвращает NEW DateTime с новым значением. Intellisense: 'Возвращает новый System.DateTime, который добавляет указанное количество дней к значению этого экземпляра.' – Plutonix
Вы должны держать это в переменной 'nextPayDate.Value.AddDays (daysToAdd);' исходная дата не изменяется , –
с нулевым значением DateTimes имеет гораздо меньше функций и ведет себя по-разному, чем DateTime. Если вы работаете с БД, нулевое значение для поля DateTime даст год 1000. Вы можете использовать регулярную DateTime и тестировать DateTime.Year> 2000, если вы хотите использовать DateTime вместо работы с NULL. –