C #: узнать, какой понедельник третий понедельник месяца? - PullRequest
4 голосов
/ 13 мая 2010

Если я пишу некоторый код C #, который проходит через год дат (повторяется по дням) и хочу, чтобы что-то особенное происходило каждый третий понедельник месяца, как я могу это сделать?

Другими словами, как лучше всего определить, какой понедельник месяца является текущим понедельником?

Ответы [ 4 ]

10 голосов
/ 13 мая 2010
public bool IsThirdMondayOfMonth(DateTime dt)
{
  if(dt.DayOfWeek == DayOfWeek.Monday && dt.Day > 14 && dt.Day <= 21)
  {
    return true;
  }
  return false;
}
8 голосов
/ 13 мая 2010

Я не думаю, что ваши "другими словами" действительно повторяют проблему, которую вы описали в первую очередь, поэтому я отвечу на оба вопроса.

Вот довольно простой метод, который будет определять 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);
}
1 голос
/ 13 мая 2010

Найдите понедельник между 15-м и 21-м включительно.

0 голосов
/ 13 мая 2010

Я не знаю, есть ли библиотека манипулирования датами, чтобы делать то, что вы хотите, но вы можете довольно легко написать свои собственные функции:

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();
    }
}
...