我为我的项目开发的方法。它正在添加所有边缘案例并在生产中工作。
/// <summary>
/// Calculates and returns the date from specifed month based on weekday and week number passed in.
/// </summary>
/// <param name="month">any date of the month as base referece</param>
/// <param name="dayOfWeek">day of week Mon/Tues/Wed/Thu/Fri etc..</param>
/// <param name="requiredWeek">!st wqeek = 1,2nd week =2,3,4,5,last etc</param>
/// <returns></returns>
public static DateTime GetFirstOccuringWeekDayFromMonth(DateTime month, DayOfWeek dayOfWeek, ReccurrenceEnum requiredWeek)
{
if (requiredWeek == ReccurrenceEnum.First || requiredWeek == ReccurrenceEnum.Second
|| requiredWeek == ReccurrenceEnum.Third || requiredWeek == ReccurrenceEnum.Forth || requiredWeek == ReccurrenceEnum.Last)
{
DateTime current;
int requiredweekno = (int)requiredWeek;
int foundDayInstanceCount = 0;
if (requiredWeek == ReccurrenceEnum.Last)
{
DateTime lastDayofMonth = new DateTime(month.AddMonths(1).Year, month.AddMonths(1).Month, 1).AddDays(-1);
DateTime firstDayofMonth = new DateTime(month.Year, month.Month, 1);
current = lastDayofMonth;
//skip until required day is reached.
while (current.DayOfWeek != dayOfWeek && current >= firstDayofMonth)
current = current.AddDays(-1);
return current;
}
else
{
DateTime firstDayofMonth = new DateTime(month.Year, month.Month, 1);
DateTime lastDayofMonth = new DateTime(month.AddMonths(1).Year, month.AddMonths(1).Month, 1).AddDays(-1);
current = firstDayofMonth;
if (current.DayOfWeek == dayOfWeek)
foundDayInstanceCount++;
//skip until required week is reached.
while (foundDayInstanceCount < requiredweekno && current <= lastDayofMonth)
{
current = current.AddDays(1);
if (current.DayOfWeek == dayOfWeek)
foundDayInstanceCount++;
}
//skip until required day is reached.
while (current.DayOfWeek != dayOfWeek && current <= lastDayofMonth)
current = current.AddDays(1);
return current;
}
}
else
throw new Exception("Exception, wrong week recurrence specified!");
}
public enum ReccurrenceEnum
{
First = 1,
Second = 2,
Third = 3,
Forth = 4,
Last = 5,
}