Скажем, я имею 28-го февраля 2010 и добавляю один месяц к этому использованию даты AddMonths(1)
...
получающаяся дата 28-го марта, но не 31-го марта, который я хочу.
Существует ли способ настроить это немного, таким образом, это работает, не добавляя пользовательский код?
Править: Мне не нужно в последний день месяца, на самом деле я должен добавить один месяц, но когда это - прошлый день месяца, я должен найти в последний день следующего месяца.
Я не знаю, чего вы хотите добиться, но вы можете добавить один день, добавить месяц и вычесть один день.
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);
}
Этот метод расширения возвращает дату следующего месяца. Когда текущая дата является последним днем месяца, он вернет последний день следующего месяца.
Я решил это сейчас, проверив, является ли это последний день месяца, используя GetLastDayInCurrentMonth . Если это так, я использую
DateTime nextMonth = date.AddDays(1).AddMonths(1).AddDays(-1);
Если это не последний день, я просто использую AddMonths (1)
Спасибо, ребята!
Нет, это не учитывается. Это полностью индивидуальный код!
Будет ли ваш код интересовать только последний день месяца или вы хотите, чтобы код добавлял месяц к любой дате, но при этом учитывал, когда указанная дата является последним днем месяца?
Если вы имеете в виду, что итоговая дата должна быть на таком же расстоянии от конца месяца, то вы используете собственный код - что-то вроде (не полностью протестировано, особенно в отношении 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;
}
}
Попробуйте перегрузить свойство day и установить его в 32. Если это сделано в JavaScript, я полагаю, что по умолчанию будет установлен последний день того месяца, в котором вы находитесь.
if(yourDate.Day == DaysInMonth(yourDate.Year,yourDate.Month)) //check for last day
yourDate.AddDays(DateTime.DaysInMonth(yourDate.Year,(yourDate.Month+1)%12));
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);
}
}