DateTime. AddMonths, добавляющий только месяц не дни

Скажем, я имею 28-го февраля 2010 и добавляю один месяц к этому использованию даты AddMonths(1)...
получающаяся дата 28-го марта, но не 31-го марта, который я хочу.
Существует ли способ настроить это немного, таким образом, это работает, не добавляя пользовательский код?

Править: Мне не нужно в последний день месяца, на самом деле я должен добавить один месяц, но когда это - прошлый день месяца, я должен найти в последний день следующего месяца.

20
задан Vikrant 25 October 2016 в 07:11
поделиться

7 ответов

Я не знаю, чего вы хотите добиться, но вы можете добавить один день, добавить месяц и вычесть один день.

DateTime nextMonth = date.AddDays(1).AddMonths(1).AddDays(-1);

EDIT:

Как отмечает один из комментаторов, это иногда дает неверный результат. Прочитав ваш обновленный вопрос, я думаю, что проще всего вычислить нужную вам дату следующим образом:

public static DateTime NextMonth(this DateTime date)
{
   if (date.Day != DateTime.DaysInMonth(date.Year, date.Month))
      return date.AddMonths(1);
   else 
      return date.AddDays(1).AddMonths(1).AddDays(-1);
}

Этот метод расширения возвращает дату следующего месяца. Когда текущая дата является последним днем месяца, он вернет последний день следующего месяца.

36
ответ дан 29 November 2019 в 23:11
поделиться

Я решил это сейчас, проверив, является ли это последний день месяца, используя GetLastDayInCurrentMonth . Если это так, я использую

DateTime nextMonth = date.AddDays(1).AddMonths(1).AddDays(-1);

Если это не последний день, я просто использую AddMonths (1)

Спасибо, ребята!

0
ответ дан 29 November 2019 в 23:11
поделиться

Нет, это не учитывается. Это полностью индивидуальный код!

Будет ли ваш код интересовать только последний день месяца или вы хотите, чтобы код добавлял месяц к любой дате, но при этом учитывал, когда указанная дата является последним днем ​​месяца?

0
ответ дан 29 November 2019 в 23:11
поделиться

Если вы имеете в виду, что итоговая дата должна быть на таком же расстоянии от конца месяца, то вы используете собственный код - что-то вроде (не полностью протестировано, особенно в отношении 28/30/31 месяцев):

class Program
{
    static void Main()
    {
        var when = DateTime.Today;
        DateTime fromEndOfNextMonth = when.AddMonthsRelativeToEndOfMonth(1);
    }

}
public static class DateTimeExtensions
{
    public static DateTime AddMonthsRelativeToEndOfMonth(
               this DateTime when, int months)
    {
        if (months == 0) return when;
        DateTime startOfNextMonth = when;
        int month = when.Month;
        while (startOfNextMonth.Month == month)
        {
            startOfNextMonth = startOfNextMonth.AddDays(1);
        }
        TimeSpan delta = startOfNextMonth - when;
        return startOfNextMonth.AddMonths(1) - delta;
    }

}
7
ответ дан 29 November 2019 в 23:11
поделиться

Попробуйте перегрузить свойство day и установить его в 32. Если это сделано в JavaScript, я полагаю, что по умолчанию будет установлен последний день того месяца, в котором вы находитесь.

-1
ответ дан 29 November 2019 в 23:11
поделиться
if(yourDate.Day == DaysInMonth(yourDate.Year,yourDate.Month)) //check for last day
    yourDate.AddDays(DateTime.DaysInMonth(yourDate.Year,(yourDate.Month+1)%12));
0
ответ дан 29 November 2019 в 23:11
поделиться
public static class DateTimeExtensions
{
    public static DateTime AddMonthsCustom(this DateTime source, int months)
    {
        DateTime result = source.AddMonths(months);
        if (source.Day != DateTime.DaysInMonth(source.Year, source.Month))
            return result;

        return new DateTime(result.Year, result.Month,
                            DateTime.DaysInMonth(result.Year, result.Month),
                            result.Hour, result.Minute, result.Second,
                            result.Millisecond, result.Kind);
    }
}
0
ответ дан 29 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: