计算前一周的开始和结束日期

时间:2009-03-18 13:59:11

标签: c#

在C#中计算前一周的开始和结束日期的最佳方法是什么?即3月18日将于3月9日(上周一)和3月15日(上周日)结束。

我已经看到使用DayOfWeek和switch语句来完成偏移,但是想知道是否有更优雅的方式。

7 个答案:

答案 0 :(得分:59)

您可以跳过while循环并使用

DateTime mondayOfLastWeek = date.AddDays( -(int)date.DayOfWeek - 6 );

这假设您使用星期一作为一周的第一天。

答案 1 :(得分:25)

DayOfWeek weekStart = DayOfWeek.Monday; // or Sunday, or whenever
DateTime startingDate = DateTime.Today;

while(startingDate.DayOfWeek != weekStart)
    startingDate = startingDate.AddDays(-1);

DateTime previousWeekStart = startingDate.AddDays(-7);
DateTime previousWeekEnd = startingDate.AddDays(-1);

阅读:一次一天回溯,直到我们在本周开始,然后减去七,到达上周的开始。

答案 2 :(得分:11)

使用Fluent DateTime https://github.com/FluentDateTime/FluentDateTime

var dateTime = 1.Weeks().Ago();
var monday = dateTime.Previous(DayOfWeek.Sunday);
var sunday = dateTime.Next(DayOfWeek.Sunday);

答案 3 :(得分:3)

使用DayOfWeek将是实现这一目标的一种方式:

    DateTime date = DateTime.Now.AddDays(-7);
    while (date.DayOfWeek != DayOfWeek.Monday)
    {
        date = date.AddDays(-1);
    }

    DateTime startDate = date;
    DateTime endDate = date.AddDays(7);

答案 4 :(得分:2)

对于当前星期日,当前接受的答案将失败,因为它指定了当前星期的星期一而不是星期一的最后一周。 (带有单元测试输出的代码)

DateTime mondayOfLastWeek = date.AddDays( -(int)date.DayOfWeek - 6 );
//Failed to get start of last-week from date-time: 2020-03-01T00:00:00.0000000Z
//  Expected: 2020-02-17 00:00:00.000
//  But was:  2020-02-24 00:00:00.000

以下代码解决了这个问题:

var dayOfWeek = (int) date.DayOfWeek - 1;
if (dayOfWeek < 0) dayOfWeek = 6;

var thisWeeksMonday = date.AddDays(-dayOfWeek).Date;
var lasWeeksMonday = thisWeeksMonday.AddDays(-7);

如果您愿意,可以将其简化为单层(我不建议使用此几乎不可读的代码...):

var mondayOfLastWeek  = date.AddDays(-(7 + ((int)date.DayOfWeek - 1 == -1 ? 6 : (int)date.DayOfWeek - 1)));

答案 5 :(得分:0)

您可以创建一个DateTime Extension方法,该方法可以与DayOfWeek参数一起使用:

public static class DateTimeExtension
{
    public static DateTime GetPreviousWeekDay(this DateTime currentDate, DayOfWeek dow)
    {
        int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow;
        return currentDate.AddDays(-7).AddDays(gotoDay-currentDay);
    }        
}

然后按如下方式使用:

DateTime testDate = new DateTime(2017, 01, 21);

Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Sunday));
Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Saturday));

答案 6 :(得分:0)

接受的解决方案实际上是不正确的。

当周“休息”时,即当它考虑一周结束或开始时,你必须切换,并且接受的解决方案中的公式不会。

星期一和星期一开始并不是那么明显,但如果你考虑星期四这周结束的话会更多。

正确的公式是(周四作为结束日):

DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1);

对于星期一,-5将切换到-2。

打印出来的示例代码

        String s = "";
        DateTime date = new DateTime(2017, 1, 1);
        for (int i = 0; i < 14; i++)
        {
            date = date.AddDays(1);
            DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1);
            DateTime mon = date.AddDays(-(int)(date.AddDays(-2).DayOfWeek) -1);
            s += date.ToString() + " - Thu: " + thu.ToString() + " - Mon: " + mon.ToString() + "\r\n";
        }
        Console.WriteLine(s);