У меня есть требование иметь относительную минимальную/максимальную проверку даты, которую можно сохранить в базе данных, чтобы настроить приложение для каждого клиента. Я решил, что NodaTime.Period
из-за возможности указывать годы был лучшим выбором. Однако NodaTime.Period
не позволяет сравнивать себя с другим периодом.
Пример данных, предоставленных для этой проверки:
- Минимальный возраст 18 лет.
- Максимальный возраст o 100 лет.
- Минимальный срок продажи 1 месяц
- Максимальная продолжительность продажи 3 месяца
- Минимальная рекламная кампания 7 дней
(Примечание. Текущие требования заключаются в том, что год/месяц/день не будут объединяться при проверке)
Валидации:
public Period RelativeMinimum { get; set; }
public Period RelativeMaximum { get; set; }
Учитывая введенную пользователем дату (и сейчас):
var now = new LocalDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
var userValue = new LocalDate(date.Year, date.Month, date.Day);
var difference = Period.Between(userValue, now);
У меня есть сравнение:
if(RelativeMinimum != null && difference.IsLessThan(RelativeMinimum))))
{
response.IsValid = false;
response.Errors.Add(MinimumErrorMessage);
}
Который потребляет класс расширений:
public static class PeriodExtensions
{
public static bool IsLessThan(this Period p, Period p2)
{
return (p.Years < p2.Years) || (p.Years == p2.Years && p.Months < p2.Months) || (p.Years == p2.Years && p.Months == p2.Months && p.Days < p2.Days);
}
public static bool IsGreaterThan(this Period p, Period p2)
{
return (p.Years > p2.Years) || (p.Years == p2.Years && p.Months > p2.Months) || (p.Years == p2.Years && p.Months == p2.Months && p.Days > p2.Days);
}
}
Хотя этот подход работает, учитывая условия тестирования, которые у меня есть, я должен задаться вопросом, почему @jon-skeet не реализовал это, и сразу же должен беспокоиться о том, что я упускаю и какую альтернативу я должен использовать вместо этого?