2009-03-18 11 views
33

Jaki jest najlepszy sposób obliczenia daty rozpoczęcia i zakończenia poprzedniego tygodnia w języku C#? To znaczy. dziś 18 marca zakończyłoby się 9 marca (poniedziałek w zeszłym tygodniu) i 15 marca (niedziela w zeszłym tygodniu).Oblicz datę początkową i końcową poprzedniego tygodnia

Widziałem to zrobić z DayOfWeek i oświadczenie switch do opracowania offsetu, ale zastanawiałem się, czy istnieje bardziej elegancki sposób.

+0

Co o powikłanie obliczania poprzedniego tygodnia pracy po zamknięciu działalności w piątek, które powinny następnie powrócić obecny tydzień, który w piątek był? –

Odpowiedz

55

można pominąć i użyć pętli while

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

Zakłada używasz poniedziałek jako pierwszy dzień tygodnia .

+2

Aby odpowiedzieć na pytanie, startOfWeek powinien mieć nazwę sundayOfLastWeek. "DateTime poniedziałekOfLastWeek = date.AddDays (- (int) date.DayOfWeek - 6);" –

+0

Dzięki za korektę Austin Salonen – bstoney

+4

Przyjemne podejście do jednej linii. Myślę, że następujące działania będą wtedy działały niezależnie od tego, w którym dniu będzie on działał: poniedziałekOfLastWeek = 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); 

Czytaj: Cofnij się jeden dzień na raz, dopóki jesteśmy na początku tego tygodnia, a następnie odjąć siedem aby dostać się na początku ubiegłego tygodnia.

+0

Smart !!! Bardzo prosty i łatwy sposób. – redDragonzz

3

Korzystanie DAYOFWEEK byłoby sposobem osiągnięcia tego celu:

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

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

Można utworzyć metody DateTime Extension, który może być używany z parametrem 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); 
    }   
} 

następnie używać go w sposób następujący:

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

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

Przyjęte rozwiązanie jest w rzeczywistości nieprawidłowe.

Musisz przełączyć się, gdy tydzień "zrywa", tj. Gdy uważa, że ​​tydzień się kończy lub zaczyna, a formuła w przyjętym rozwiązaniu nie.

To nie jest tak widoczne w poniedziałek jako początek tygodnia, ale bardziej, jeśli weźmiesz pod uwagę czwartek pod koniec tygodnia.

Dokładny wzór jest (na czwartek to dzień)

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

Na poniedziałek -5 przestawiliby -2.

Przykład kodu wydrukować

 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); 
Powiązane problemy