Подтвердить что ты не робот

Рассчитать начальную и конечную дату на прошлой неделе

Каков наилучший способ рассчитать начальную и конечную дату на предыдущей неделе в С#? То есть сегодня 18 марта состоится 9 марта (понедельник на прошлой неделе) и 15 марта (воскресенье на прошлой неделе).

Я видел это с помощью DayOfWeek и оператора switch для разработки смещения, но задавался вопросом, есть ли более элегантный способ.

4b9b3361

Ответ 1

Вы можете пропустить цикл while и использовать

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

Предполагается, что вы используете понедельник в качестве первого дня недели.

Ответ 2

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);

Читайте: Откат один день за один раз, пока мы не начнем эту неделю, а затем вычитаем семь, чтобы добраться до начала прошлой недели.

Ответ 4

Использование DayOfWeek было бы способом достижения этого:

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

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

Ответ 5

Вы можете создать метод расширения DateTime, который можно использовать с параметром 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

Принятое решение на самом деле неверно.

Вы должны переключаться, когда неделя "ломается", т.е. когда она считает, что неделя заканчивается или запускается, а формула в принятом решении не работает.

Это не так заметно в понедельник как начало недели, но тем более, если вы считаете, что в четверг конец недели.

Правильная формула (для четверга как день окончания):

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);