2009-03-18 7 views
33

Quelle est la meilleure façon de calculer la date de début et de fin de la semaine précédente en C#? C'est à dire. aujourd'hui 18 mars se traduirait le 9 mars (lundi la semaine dernière) et le 15 mars (dimanche la semaine dernière).Calculer la date de début et de fin de la semaine précédente

J'ai vu cela fait avec DayOfWeek et une déclaration de commutateur pour élaborer un décalage, mais je me demandais s'il y a un moyen plus élégant.

+0

Qu'en est la complication de calcul de la durée hebdomadaire du travail précédent après la fermeture des bureaux le vendredi, qui devrait alors revenir la semaine en cours ce vendredi était? –

Répondre

55

Vous pouvez sauter la boucle while et utiliser

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

Cela suppose que vous utilisez lundi comme le premier jour de la semaine .

+2

Pour répondre à la question, startOfWeek devrait s'appeler sundayOfLastWeek. "DateTime lundiOfLastWeek = date.AddDays (- (int) date.DayOfWeek - 6);" –

+0

Merci pour la correction Austin Salonen – bstoney

+4

Belle approche d'un revêtement. Je pense que ce qui suit fonctionnerait quel que soit le jour de son exécution: 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); 

Lire: Retour arrière d'un jour à la fois jusqu'à ce que nous sommes au début de cette semaine, puis soustraire sept pour arriver au début de la semaine dernière.

+0

Smart !!! Un moyen très simple et facile – redDragonzz

3

L'utilisation DayOfWeek serait un moyen d'y parvenir:

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

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

Vous pouvez créer une méthode d'extension DateTime, qui peut être utilisé avec un paramètre 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); 
    }   
} 

utiliser ensuite comme suit:

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

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

La solution acceptée n'est pas correcte.

Vous devez basculer lorsque la semaine «se rompt», c'est-à-dire quand il considère que la semaine se termine ou commence et que la formule de la solution acceptée ne l'est pas.

Ce n'est pas si visible un lundi que le début de la semaine, mais plus si vous envisagez jeudi la fin de la semaine.

formule correcte est (pour un jeudi comme jour de fin):

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

Pour lundi, -5 passeraient à -2.

code exemple pour imprimer

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