2009-06-02 2 views
6

Учитывая стандартную часть информации о планировании, такую ​​как «второй вторник в июне 2009 года» или «последняя пятница в июле 2009 года», какая самая простая и эффективная формула для перевода на дату?Простая формула для определения даты с использованием недели месяца?

Входы:

  • w = Неделя месяца, перечисление (1-й, 2-й, 3, 4 или Последний)
  • d = день недели, перечисление ВС через СБ
  • m = Месяц, целое число
  • y = год, целое число

EDIT (еще раз) - Не имеет значения, в какой день начинается неделя; Я хочу получить w-й экземпляр d в этом месяце. Таким образом, второе воскресенье июня 2009 года - 14 июня, хотя это технически относится к третьей неделе июня; аналогичным образом 1-е воскресенье июня - 7 июня, но не исключение/исключение.

+0

Вам нужна дополнительная информация - в какой день делать„недели“начнется в субботу, в воскресенье или в понедельник? Что относительно месяцев с пятью из того же дня недели (нет «Пятого?») – mquander

+0

Отредактировано - неделя начинается в воскресенье. Возьмите это как указано, что нам не нужна «пятая» неделя. –

+1

Основываясь на ваших двух примерах вопросов «2-й вторник в июне 09» и последней «пятнице в 09-ое июля», не начинается ли неделя в любой день недели 1-го месяца? –

ответ

8

Что-то вроде:

static DateTime GetDate(int year, int month, DayOfWeek dayOfWeek, 
     int weekOfMonth) { 
    // TODO: some range checking (>0, for example) 
    DateTime day = new DateTime(year, month, 1); 
    while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1); 
    if (weekOfMonth > 0) { 
     return day.AddDays(7 * (weekOfMonth - 1)); 
    } else { // treat as last 
     DateTime last = day; 
     while ((day = day.AddDays(7)).Month == last.Month) { 
      last = day; 
     } 
     return last; 
    } 
} 
+0

(отредактирован для обработки «последним» через неделюOfMonth <= 0) –

+0

Отличный ответ снова - спасибо Marc! –

1

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

второй редактирование исправить выпуск диска»Марк

static DateTime GetDate(int year, int month, 
       DayOfWeek weekDay, int week) 
{ 
    DateTime first = new DateTime(year, month, 1); 
    int iDow = (int)weekday, iFirst = (int)first.DayOfWeek; 
    int adjust = (7+iDow-iFirst)%7 - 7; 
    return first.AddDays(7*week + adjust); 
} 
+0

Должно ли это быть 7 * (неделя-1)? Тем не менее, используя эту формулу, «1-е воскресенье июня 2009 года» выходит до 31 мая 2009 года. –

+0

ну, нет, причина, по которой дни будут вычитаться до шести дней, когда просят день недели с меньшим значением перечисления, чем день недели 1-го, но был глючит, когда дневной номер спросил, был ли тот же самый, что и первый месяц ... –

+0

С правлением, 1-е воскресенье в январе 2009 года выходит в понедельник 5-го ... –

0
using System; 

namespace date_using_week_of_month 
{ 

    public class Example 
    { 
     public static DateTime WthDayDOfMonthM(int w, DayOfWeek d, DateTime month) 
     { 
      return first(d, month).AddDays(7 * (w - 1)); 
     } 

     private static DateTime first(DayOfWeek d, DateTime month) 
     { 
      DateTime first = new DateTime(
       month.Year, month.Month, 1); 
      while (first.DayOfWeek != d) 
      { 
       first = first.AddDays(1); 
      } 
      return first; 
     } 
    } 
} 
Смежные вопросы