У меня есть следующая проблема: я пытаюсь рассчитать дни между первым днем исполнительного месяца и неделей и его недельным днем. Например: на самом деле это февраль. У меня будут дни между первым днем этого месяца и второй средой. Как я могу сделать это как можно более чистым?Получайте дни между первым днем месяца и указанным днем недели и недели
ответ
Ну, вы можете получить первый день текущего месяца;
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 дней.
Вот метод расширения, который находит в первый день месяца:
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;
Вот решение без петель или условными:
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
Любых усилиями до сих пор? –
Есть ли у вас код, показывающий, что не работает для вас? –
Мой мозг не работает. Я понятия не имею, как я могу практиковать это. Может кто-нибудь подскажет мне. –