在c#中获取一个月后的下一天



在c#中,我如何获得月份之后的下一个特定日期,例如,如果今天是Monday,我需要从现在起一个月后获得第一个Monday,但以更通用的方式,例如,如果现在是17/11/2021,即Wednesday,我需要在一个月之后获得第一个Wednesday

我正在使用此功能,但它将在下周返回,而不是在下个月

public static DateTime GetNextWeekday(DateTime start, DayOfWeek day)
{
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysToAdd = ((int)day - (int)start.DayOfWeek + 7) % 7;
return start.AddDays(daysToAdd);
}

典型的月份有3031天,但是,一周中的下一个同一天将在28(4 * 7(或35(5 * 7(天后。我们需要妥协。让February增加28天,所有其他月份增加35天:

public static DateTime GetSameDayAfterMonth(DateTime start) =>
start.AddDays((start.AddMonths(1) - start).TotalDays < 30 ? 28 : 35);

当然,你可以详细说明其他规则:比如,当添加28天后,我们仍然在同一个月(1 May + 28 days == 29 May(时,我们应该添加35:

public static DateTime GetSameDayAfterMonth(DateTime start) =>
start.AddDays(start.Month == start.AddDays(28).Month ? 35 : 28);

在开始日期后添加一个月,而不是一周:

public static DateTime GetSameDayAfterMonth(DateTime start)
{
var compare = start.AddMonths(1);
// The % 7 ensures we end up with a value in the range [0, 6]
int daysToAdd = ((int)start.DayOfWeek - (int)compare.DayOfWeek) % 7;
return compare.AddDays(daysToAdd);
}

示例:

var dayInNextMonth = GetSameDayAfterMonth(DateTime.Parse("2021-11-17")); // 2021-12-15
var weekday = dayInNextMonth.DayOfWeek; // Wednesday

最新更新