2015-02-12 2 views
-1

У меня есть следующая проблема: я пытаюсь рассчитать дни между первым днем ​​исполнительного месяца и неделей и его недельным днем. Например: на самом деле это февраль. У меня будут дни между первым днем ​​этого месяца и второй средой. Как я могу сделать это как можно более чистым?Получайте дни между первым днем ​​месяца и указанным днем ​​недели и недели

+3

Любых усилиями до сих пор? –

+2

Есть ли у вас код, показывающий, что не работает для вас? –

+0

Мой мозг не работает. Я понятия не имею, как я могу практиковать это. Может кто-нибудь подскажет мне. –

ответ

1

Ну, вы можете получить первый день текущего месяца;

DateTime firstDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); 

И вы можете получить вторую среду;

DateTime secondWednesday = firstDay.AddDays(7); 

while(secondWednesday.DayOfWeek != DayOfWeek.Wednesday) 
{ 
    secondWednesday = secondWednesday.AddDays(1); 
} 

Поскольку мы пытаемся получить вторую среду, в худшем случае, вторая среда будет номер 8 текущего месяца. Если день - среда, то вторая среда будет 8th месяца. Кроме этого, число дней будет больше, чем 8.

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

я нашел большой ответ на Mark Ransom на this question;

Язык агностик версия:

Чтобы получить первый конкретный день месяца, начните с первым днем ​​ месяца: гггг-мм-01. Используйте любую функцию, чтобы дать номер , соответствующий дню недели. Вычтите это число от в тот день, когда вы ищите; например, если первый день месяца - среда (2), и вы ищете пятницу (4), вычтите 2 из 4, оставив 2. Если ответ отрицательный, добавьте 7. Наконец добавьте, что в первый месяц; для моего примера, в первую пятницу будет 3-й.

Чтобы перейти в последнюю пятницу месяца, найдите первую пятницу следующего месяца: и вычтите 7 дней.

0

Вот метод расширения, который находит в первый день месяца:

public static DateTime FirstDayOfMonth(this DateTime datetime) 
{ 
    return datetime.AddDays(-(datetime.Day - 1)); 
} 

Вот один, который находит следующий любой день недели:

public static DateTime Next(this DateTime datetime, DayOfWeek day) 
{ 
    return datetime.AddDays(datetime.DayOfWeek < day ? 
     day - datetime.DayOfWeek : 
     7 + day - datetime.DayOfWeek); 
} 

Вот тот, который находит первый из любой день недели в месяц:

public static DateTime FirstDayOfMonth(this DateTime datetime, DayOfWeek day) 
{ 
    DateTime first = datetime.FirstDayOfMonth(); 
    return first.DayOfWeek == day ? first : first.Next(day); 
} 

найти вторую среду после того, как в первый день месяца:

DateTime now = DateTime.Now; 
DateTime firstWednesday = now.FirstDayOfMonth(DayOfWeek.Wednesday); 
DateTime secondWednesday = firstWednesday.AddDays(7); 

int difference = secondWednesday.Day - 1; 
0

Вот решение без петель или условными:

DateTime NthWeekdayInCurrentMonth(int n, DayOfWeek day) 
{ 
    var firstOfMonth = DateTime.Now.AddDays(-(DateTime.Now.Day-1)); 
    var firstWeekDay = firstOfMonth.AddDays(day - firstOfMonth.DayOfWeek); 
    var NthWeekDay = firstWeekDay.AddDays(7*(n-1)); 
} 

Вы можете добавить некоторые проверки границ на n, чтобы убедиться, что ваш результат всегда в текущем месяце.

Вы можете легко получить количество дней между результирующей датой и первым месяцем следующим образом:

NthWeekdayInCurrentMonth(2, DayOfWeek.Wednesday).Day-1