6

给定一条标准的日程安排信息,例如“2009 年 6 月的第二个星期二”或“2009 年 7 月的最后一个星期五”,将其转换为日期的最简单和最有效的公式是什么?

输入:

  • w= 每月的第几周,枚举(第 1、第 2、第 3、第 4 或最后)
  • d= 星期几,枚举 Sun 到 Sat
  • m= 月,整数
  • y= 年,整数

编辑(再次) ——一周从哪一天开始并不重要;我想在给定月份获取d的第w个实例。因此,2009 年 6 月的第二个星期日是 6 月 14 日,尽管从技术上讲,它是在 6 月的第三周;同样,6 月的第一个星期日是 6 月 7 日,不是空值/异常。

4

3 回答 3

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;
    }
}
于 2009-06-02T13:17:20.960 回答
1

编辑以修复错误,当要求的工作日与第一个月的星期几相同。

马克的第二次编辑以修复问题光盘

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);
}
于 2009-06-02T13:38:04.397 回答
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;
        }
    }
}
于 2009-06-05T16:04:16.550 回答