Простая формула для определения даты с использованием недели месяца? - PullRequest
6 голосов
/ 02 июня 2009

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

Входы:

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

РЕДАКТИРОВАТЬ (снова) - Неважно, с какого дня начинается неделя; Я хочу получить w th экземпляра d в данном месяце. Таким образом, второе воскресенье июня 2009 года - 14 июня, хотя технически это происходит на третьей неделе июня; аналогично 1-е воскресенье июня - 7 июня, не ноль / исключение.

Ответы [ 3 ]

8 голосов
/ 02 июня 2009

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

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;
    }
}
1 голос
/ 02 июня 2009

ИЗМЕНЕНО для исправления ошибки, когда запрашиваемый день недели совпадает с днем ​​недели первого месяца.

2-е редактирование, чтобы исправить проблему диска 'от Marc

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 голосов
/ 05 июня 2009
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;
        }
    }
}
...