Как я могу получить общее количество определенного дня в конкретном месяце / году? - PullRequest
0 голосов
/ 03 сентября 2010

Допустим, я хочу узнать число понедельников в феврале 2014 года.

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

Ответы [ 4 ]

8 голосов
/ 03 сентября 2010
static int NumberOfParticularDaysInMonth(int year, int month, DayOfWeek dayOfWeek)
{
    DateTime startDate = new DateTime(year, month, 1);
    int totalDays = startDate.AddMonths(1).Subtract(startDate).Days;

    int answer = Enumerable.Range(1, totalDays)
        .Select(item => new DateTime(year, month, item))
        .Where(date => date.DayOfWeek == dayOfWeek)
        .Count();

    return answer;
}

...

int numberOfThursdays = NumberOfParticularDaysInMonth(2010, 9, DayOfWeek.Thursday);
3 голосов
/ 04 сентября 2010

@ Энтони дал хорошее решение Linq, вот более традиционная реализация.

static int CountDayOfWeekInMonth(int year, int month, DayOfWeek dayOfWeek)
{
  DateTime startDate = new DateTime(year, month, 1);
  int days = DateTime.DaysInMonth(startDate.Year, startDate.Month);
  int weekDayCount = 0;
  for (int day = 0; day < days; ++day)
  {
    weekDayCount += startDate.AddDays(day).DayOfWeek == dayOfWeek ? 1 : 0;        
  }
  return weekDayCount;
}

Используется следующим образом

int numberOfThursdays = CountDayOfWeekInMonth(2014, 2, DayOfWeek.Thursday);  
2 голосов
/ 03 сентября 2010

Это должно помочь вам в начале:

Как: получить все понедельники за данный год в C #

Вы просто должны адаптировать его для использованиямесяц / год, а не только год.

Решение, которое почти дает желаемое:

Список первого понедельника каждого месяца с использованием C # и VB.NET

0 голосов
/ 30 апреля 2012

Зачем перебирать весь месяц, пока его можно вычислить?

Public Function CountDayOfWeekInMonth(ByVal DateTargeted As Date, Optional ByVal StartingDay As DayOfWeek = DayOfWeek.Sunday) As Integer
    Dim dCountingDate As New DateTime(DateTargeted.Year, DateTargeted.Month, 1)
    Dim iDaysInMonth As Integer = DateTime.DaysInMonth(dCountingDate.Year, dCountingDate.Month)
    Dim iDaysToAdd As Integer = (7 + CType(StartingDay, Integer) - dCountingDate.DayOfWeek) Mod 7
    Dim iFirstStartingDay As Integer = dCountingDate.AddDays(iDaysToAdd).Day
    Return Math.Truncate((iDaysInMonth - iFirstStartingDay) / 7) + 1
End Function

Используется как следует

Dim iResult as Integer = CountDayOfWeekInMonth(New DateTime(2012, 04, 30), DayOfWeek.Monday)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...