Сначала вы добавили как строку, вы должны написать num1 = [1] Когда вы пишете «any_number», это определяется как строка, а не как целое число.
Не может найти удобную остроту, но эти работы:
static DateTime LastDayOfWeekInMonth(DateTime day, DayOfWeek dow)
{
DateTime lastDay = new DateTime(day.Year, day.Month, 1).AddMonths(1).AddDays(-1);
DayOfWeek lastDow = lastDay.DayOfWeek;
int diff = dow - lastDow;
if (diff > 0) diff -= 7;
System.Diagnostics.Debug.Assert(diff <= 0);
return lastDay.AddDays(diff);
}
Получите первый день в следующем месяце, затем найдите первый mathing рабочий день в том месяце. Возвратитесь семь дней, и Вы в тот рабочий день на прошлой неделе corrent месяца:
DateTime date = new DateTime(2009, 3, 12);
DayOfWeek day = DayOfWeek.Sunday;
DateTime nextMonth = new DateTime(date.Year, date.Month, 1).AddMonths(1);
while (nextMonth.DayOfWeek != day) {
nextMonth = nextMonth.AddDays(1);
}
DateTime lastInMonth = nextMonth.AddDays(-7);
(Вы могли заменить цикл некоторой арифметикой, которая вычисляет количество дней для добавления на основе числовых значений значений DayOfWeek, но это является более прямым.)
Править:
Вы могли, конечно, также добраться в последний день в текущем месяце, затем цикл назад, пока Вы не находите корректный рабочий день.
http://datetimeextensions.codeplex.com/ имеет Последний (dayOfWeek) дополнительный метод, который сделает это для Вас
Тест включен :-)
static DateTime LastDateOfWeekForMonth(DayOfWeek weekday, int month, int year)
{
DateTime d = new DateTime(year, month, 1).AddMonths(1);
while (!(d.DayOfWeek == weekday && d.Month == month))
{
d = d.AddDays(-1);
}
return d;
}
Попробуйте это: запустите в прошлый день и рассчитайте назад, пока Вы не поражаете день, который Вы ищете
static DateTime LastOccurenceOfDay(DateTime dt, DayOfWeek dow)
{
DateTime looperDate = new DateTime(dt.Year, dt.Month, 1)
.AddMonths(1).AddDays(-1);
while (looperDate.DayOfWeek!=dow)
looperDate =looperDate.AddDays(-1);
return looperDate;
Править: Восстановленный старая версия Dangph обращается к в комментариях.
static DateTime LastOccurenceOfDay(DateTime dt, DayOfWeek dow)
{
//set start of loop
DateTime looperDate = new DateTime(dt.Year, dt.Month, 1);
//initialze return value
DateTime returnDate = dt;
//loop until the month is over
while (looperDate.Month == dt.Month)
{
//if the current DayOfWeek is the date you're looking for
if (looperDate.DayOfWeek == dow)
//remember it.
returnDate = looperDate;
//increase day
looperDate=looperDate.AddDays(1);
}
return returnDate;
}
public DateTime GetLastDayOfMonth(int year, int month, DayOfWeek dayOfWeek)
{
var daysInMonth = DateTime.DaysInMonth(year, month);
var lastDay = new DateTime(year, month, daysInMonth);
while (lastDay.DayOfWeek != dayOfWeek)
{
lastDay = lastDay.AddDays(-1);
}
return lastDay;
}
static DateTime GetDayOfWeekInMonthFromWeekIndex(this DateTime date, DayOfWeek dow, int weekIndex)
{
if (weekIndex > 4)
return LastDayOfWeekInMonth(date, dow);
DateTime newDate = new DateTime(date.Year, date.Month, 1);
DayOfWeek newDow = newDate.DayOfWeek;
int diff = dow - newDow;
diff += ((weekIndex - 1) * 7);
return newDate.AddDays(diff);
}