在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);
}
典型的月份有30
或31
天,但是,一周中的下一个同一天将在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