Если я пишу некоторый код C#, который пробегает год дат (выполняющий итерации днем), и хотят, чтобы что-то специальное произошло каждый 3-й понедельник месяца, как я могу выполнить это?
Другими словами, что состоит в том, чтобы найти лучший способ, который в понедельник месяца текущий понедельник?
public bool IsThirdMondayOfMonth(DateTime dt)
{
if(dt.DayOfWeek == DayOfWeek.Monday && dt.Day > 14 && dt.Day <= 21)
{
return true;
}
return false;
}
Я не знаю, есть ли библиотека управления датами, чтобы делать то, что вы хотите, но вы можете довольно легко написать свои собственные функции:
using System;
class Program {
static void Main(string[] args) {
int year = 2010;
int month = 05;
DateTime thirdMonday = ThirdMonday(year, month);
}
private static DateTime ThirdMonday(int year, int month) {
for (int day = 1; day <= DateTime.DaysInMonth(year, month); ++day) {
DateTime dt = new DateTime(year, month, day);
if (dt.DayOfWeek == DayOfWeek.Monday) {
return dt.AddDays(14);
}
}
// this should never happen
throw new Exception();
}
}
Я не думаю, что ваш "в Другими словами, «действительно переформулирует проблему, которую вы описываете первой, поэтому я отвечу на оба вопроса.
Вот довольно простой метод, который определяет n-е появление определенного дня недели в данном месяце в данном году.
public static DateTime DayOccurrence(int year, int month, DayOfWeek day,
int occurrenceNumber)
{
DateTime start = new DateTime(year, month, 1);
DateTime first = start.AddDays((7 - ((int)start.DayOfWeek - (int)day)) % 7);
return first.AddDays(7 * (occurrenceNumber - 1));
}
Определить, в какой понедельник (или любой другой день) месяца назначена дата, намного проще; просто возьмите потолок дня месяца / 7:
public static int DayOccurrence(DateTime date)
{
return (int)Math.Ceiling(date.Day / 7.0);
}
Найдите понедельник между 15 и 21 числами включительно.