Ответ 1
Вы можете пропустить цикл while и использовать
DateTime mondayOfLastWeek = date.AddDays( -(int)date.DayOfWeek - 6 );
Предполагается, что вы используете понедельник в качестве первого дня недели.
Каков наилучший способ рассчитать начальную и конечную дату на предыдущей неделе в С#? То есть сегодня 18 марта состоится 9 марта (понедельник на прошлой неделе) и 15 марта (воскресенье на прошлой неделе).
Я видел это с помощью DayOfWeek и оператора switch для разработки смещения, но задавался вопросом, есть ли более элегантный способ.
Вы можете пропустить цикл while и использовать
DateTime mondayOfLastWeek = date.AddDays( -(int)date.DayOfWeek - 6 );
Предполагается, что вы используете понедельник в качестве первого дня недели.
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);
Читайте: Откат один день за один раз, пока мы не начнем эту неделю, а затем вычитаем семь, чтобы добраться до начала прошлой недели.
с использованием Fluent DateTime https://github.com/FluentDateTime/FluentDateTime
var dateTime = 1.Weeks().Ago();
var monday = dateTime.Previous(DayOfWeek.Sunday);
var sunday = dateTime.Next(DayOfWeek.Sunday);
Использование DayOfWeek было бы способом достижения этого:
DateTime date = DateTime.Now.AddDays(-7);
while (date.DayOfWeek != DayOfWeek.Monday)
{
date = date.AddDays(-1);
}
DateTime startDate = date;
DateTime endDate = date.AddDays(7);
Вы можете создать метод расширения 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));
Принятое решение на самом деле неверно.
Вы должны переключаться, когда неделя "ломается", т.е. когда она считает, что неделя заканчивается или запускается, а формула в принятом решении не работает.
Это не так заметно в понедельник как начало недели, но тем более, если вы считаете, что в четверг конец недели.
Правильная формула (для четверга как день окончания):
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);