Эта проблема отслеживает интерес к реализации пользовательских сообщений об ошибках с использованием механизма .because()
.
Тем временем, avrelian создал симпатичную библиотеку, которая реализует пользовательские сообщения об ошибках, используя механизм since()
- jasmine-custom-message
.
Чтобы проверить, является ли дата концом месяца, вы проверяете, является ли следующий день первым днем какого-либо месяца. ваш алгоритм должен быть таким: «Если день не является концом месяца, добавьте 1 месяц. Если это конец месяца, добавьте один день, добавьте один месяц, вычтите один день».
bool IsEndOfMonth(DateTime date) {
return date.AddDays(1).Day == 1;
}
DateTime AddMonthSpecial(DateTime date) {
if (IsEndOfMonth(date))
return date.AddDays(1).AddMonths(1).AddDays(-1);
else
return date.AddMonths(1);
}
Можете ли вы попасть туда, начав с первого дня предыдущего месяца и вернувшись на один день назад?
DateTime exampleDate = DateTime.Parse("12/31/2009");
bool isLastDayOfMonth = (exampleDate.AddDays(1).Month != exampleDate.Month);
if (isLastDayOfMonth)
Console.WriteLine(exampleDate.AddDays(1).AddMonths(1).AddDays(-1));
else
Console.WriteLine(new DateTime(exampleDate.Year, exampleDate.Month, 1).AddMonths(2).AddDays(-1));
РЕДАКТИРОВАТЬ: Я снова прочитал ваш вопрос. Вам нужно будет поставить чек, чтобы узнать, не наступил ли последний день месяца.
Извините, мне жаль, что я четко не прочитал вопрос о том, что требуется.
Надеюсь, этого достаточно, чтобы дать вам представление о том, что вам нужно.
Вот простое решение .NET C #, которое учитывает високосные годы и т. Д .:
static DateTime ContractDue(DateTime start, int months)
{
if (start.Month == start.AddDays(1).Month)
{ // Same month, just add the months
return start.AddMonths(months);
}
// Last day of month... add a day, add the months, then go back one day
return start.AddDays(1).AddMonths(months).AddDays(-1);
}
Мой подход к этой проблеме начнется с процедуры, которая определяет, является ли данный день последним днем месяца ( учитывая, конечно, февраль високосного года!)
Вам также понадобится процедура, которая дает вам последний день месяца, учитывая день в этом месяце.
Затем, если вы встретите день, который ЯВЛЯЕТСЯ последний день, добавьте один день и используйте вторую процедуру, чтобы получить последний день ЭТОГО месяца. Используйте цикл на несколько месяцев.
Вы могли бы реализовать EndOfMonth () и isEndOfMonth ().
так что ваш код будет, более или менее,
if isEndOfMonth( this.Date() )
endDate = (startmonth + addedMonths).EndOfMonth()
else
endDate = startDate + addedMonths
немного упрощенным, но вы поняли идею.
Здесь, конечно, есть много идей для логики EndOFMonth и isEndOfMonth
Если вам нужен только EndOfMonth или простой AddNMonth, то вы уже получили свой ответ.
В противном случае, чтобы иметь полное универсальное решение, вам потребуется реализация шаблона повторения, как вы можете см. его в пользовательском интерфейсе интерфейса собрания Outlook . Я не предлагаю вам использовать реализацию Outlook, но должно быть несколько компонентов .NET, которые вы можете купить. Или реализуйте его самостоятельно, но не недооценивайте и не тестируйте все модули - это очень сложный компонент для реализации.
Вы можете использовать метод DateTime.DaysInMonth () примерно так:
DateTime workingMonth = new DateTime(2009, 06, 30).AddDays(1);
int nextMonthDays = DateTime.DaysInMonth(workingMonth.Year, workingMonth.Month);
DateTime newMonth = new DateTime(workingMonth.Year, workingMonth.Month, nextMonthDays);