如何从DayOfWeek和WeekOfMonth获取日期时间?

时间:2014-04-02 10:13:02

标签: c#

我有DayOfWeek和WeekOfMonth,我想使用两个值来获取日期时间。

例如:DayOfWeek = 2(星期二),WeekOfMonth = 3(每月第三周)

public DateTime GetDateTime(int year, int month, int dayOfWeek, int weekOfMonth)

我想要一个上面的方法来处理和返回日期时间。 我怎样才能获得该日期时间?

2 个答案:

答案 0 :(得分:0)

这段代码会帮助你吗?

public DateTime GetDateTime(int year, int month, int dayOfWeek, int weekOfMonth)
{

     var date = new DateTime(year, month, 1);
     var temp = (int)date.DayOfWeek;
     var day = 7 - (temp - 1) + ((weeks - 2) * 7) + dayOfWeek;

     return new DateTime(year, month, day);
}

如果你有第3周,那么第1周和第2周各7天。添加dayOfWeek将为您提供月中的日期。

答案 1 :(得分:0)

首先,你必须知道这个月开始的那一天。然后计算你想要的日子很简单。

代码: 可能是,对你来说,周并不是星期天开始,而是星期一。因此,您创建了一个能够帮助我们完成所有案例的枚举:

internal enum StartingWeek
{
    WeekBeginWithSunday,
    WeekBeginWithMonday
};

然后,只需计算一周的开始日。

private static DateTime GetDateTime(int year, int month, DayOfWeek dayofweek, int weekofmonth, StartingWeek start = StartingWeek.WeekBeginWithSunday)
{
    DateTime firstDayOfMonth = new DateTime(year, month, 1);

    // ajust calcul with starting day on the week
    int delta = start == StartingWeek.WeekBeginWithMonday ? 1 : 0;

    int durationOfFirstWeek = (7 - (int)firstDayOfMonth.DayOfWeek + delta) % 7;

    int day = durationOfFirstWeek + (weekofmonth - 2) * 7 + ((int)dayofweek + 7 - delta) % 7 + 1;

    // day is on the previous month
    if (day <= 0)
    {
        return new DateTime(year, month, 1);
    }

    if (day <= DateTime.DaysInMonth(year, month))
    {
        return new DateTime(year, month, day);
    }

    // day is on next month
    return new DateTime(year, month, DateTime.DaysInMonth(year, month));
}

我决定在本月的第一天或最后一天返回例外,但你可以为这些案件做你想做的事。

测试:

private static void Main(string[] args)
{
    int year = 2014;
    int month = 10;
    DayOfWeek dayofweek = DayOfWeek.Saturday;
    int weekofmonth = 2;
    DateTime date = GetDateTime(year, month, dayofweek, weekofmonth);
    Console.WriteLine(date.ToShortDateString());

    DateTime date2 = GetDateTime(year, month, DayOfWeek.Monday, 1, StartingWeek.WeekBeginWithMonday);
    Console.WriteLine(date2.ToShortDateString());

    DateTime date2b = GetDateTime(year, month, DayOfWeek.Saturday, 1, StartingWeek.WeekBeginWithMonday);
    Console.WriteLine(date2b.ToShortDateString());

    DateTime date2c = GetDateTime(year, month, DayOfWeek.Saturday, 2, StartingWeek.WeekBeginWithMonday);
    Console.WriteLine(date2c.ToShortDateString());

    DateTime date2d = GetDateTime(year, month, DayOfWeek.Sunday, 1, StartingWeek.WeekBeginWithMonday);
    Console.WriteLine(date2d.ToShortDateString());

    DateTime date2e = GetDateTime(year, month, DayOfWeek.Sunday, 2, StartingWeek.WeekBeginWithMonday);
    Console.WriteLine(date2e.ToShortDateString());

    DateTime date3 = GetDateTime(year, month, DayOfWeek.Saturday, 5, StartingWeek.WeekBeginWithMonday);
    Console.WriteLine(date3.ToShortDateString());

    Console.ReadLine();
}

输出(法语格式)

11/10/2014
01/10/2014
04/10/2014
11/10/2014
05/10/2014
12/10/2014
31/10/2014