查找日历的第一天

And*_*eas 14 c# datetime calendar

我想要做的是创建一个简单的日历,我想找到特定月份的第一周的第一天.我的日历是星期一 - >星期日日历,以下代码有效,但正如您所看到的那样,它并不是那么好.任何人都可以更好地了解如何在日历中获得第一个日期.

var now = new DateTime(Year, Month, 1);
now = now.AddDays(1-(int)now.DayOfWeek);
now = now.Day > 15 ? now : now.AddDays(-7);
Run Code Online (Sandbox Code Playgroud)

日历最终看起来像这样:

| <  |        Jan  2011       |  > |
------------------------------------
| Mo | Tu | We | Th | Fr | Sa | Su |
|[27]| 28 | 29 | 30 | 31 | 01 | 02 |
| 03 | 04 | 05 | 06 | 07 | 08 | 09 |
| .. | .. | .. | .. | .. | .. | .. |
| .. | .. | .. | .. | .. | .. | .. |
| 31 | 01 | 02 | 03 | 04 | 05 | 06 |
Run Code Online (Sandbox Code Playgroud)

在这个"形象"中,这是我试图找到的[27]日期.

解决方案(发现我更好/更清洁循环然后计算):

    public DateTime FirstDay()
    {
        var date = new DateTime(Date.Year, Date.Month, 1);
        while (true)
        {
            if (date.DayOfWeek == DayOfWeek.Monday)
                return date;
            date = date.AddDays(-1);
        }
        return date;
    }

    public DateTime LastDay()
    {
        var date = new DateTime(Date.Year, Date.Month, 
                                DateTime.DaysInMonth(Date.Year, Date.Month));
        while (true)
        {
            if (date.DayOfWeek == DayOfWeek.Sunday)
                return date;
            date = date.AddDays(1);
        }
        return date;
    }
Run Code Online (Sandbox Code Playgroud)

/ BR Andreas

jas*_*son 9

我会这样做的.这很容易理解:

var firstDayOfMonth = new DateTime(year, month, 1);
DateTime startOfCalendar = 
    FirstDayOfWeekOnOrBefore(
        firstDayOfMonth,
        DayOfWeek.Monday
    );

public static DateTime FirstDayOfWeekOnOrBefore(
    DateTime date,
    DayOfWeek dayOfWeek
) {
    while(date.DayOfWeek != dayOfWeek) {
        date = date.AddDays(-1);
    }
    return date;
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您想要将日历更改为从星期一以外的其他内容开始,那么现在这很简单.使用模运算的解决方案不可维护.