2009-03-18 2 views
33

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

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

+0

насчет усложнения расчета предыдущей рабочей недели после закрытия торгов в пятницу, который должен затем вернуться на текущей неделе, что в пятницу была? –

ответ

55

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

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

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

+2

Чтобы ответить на вопрос, startOfWeek следует называть sundayOfLastWeek. "DateTime mondayOfLastWeek = date.AddDays (- (int) date.DayOfWeek - 6);" –

+0

Спасибо за исправление Остин Салонен – bstoney

+4

Ницца подход один лайнер. Я думаю, что тогда будет работать независимо от того, в какой день его запуск: mondayOfLastWeek = DateTime.Now.AddDays (- (int) DateTime.Now.DayOfWeek - 6); sundayOfLastWeek = DateTime.Now.AddDays (- (int) DateTime.Now.DayOfWeek); – Henryk

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

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

+0

Умный !!! Очень простой и легкий способ – redDragonzz

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

Вы можете создать метод 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)); 
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); 
Смежные вопросы