2009-11-03 10 views
56

Je me demandais si vous savez comment obtenir la date du lundi de la semaine en fonction de la date d'aujourd'hui?Recevez la date du premier lundi de la semaine?

-à-dire 2009-11-03 passé et 2009-11-02 est renvoyée en arrière

/M

+1

Jetez un oeil à cette question: http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week –

Répondre

125

Voici ce que j'utilise (probablement pas internationalisé):

DateTime input = //... 
int delta = DayOfWeek.Monday - input.DayOfWeek; 
DateTime monday = input.AddDays(delta); 
+1

Oui, en effet: Non internationalisé. Le lundi n'est pas toujours le premier jour de la semaine. –

+15

Vous pouvez obtenir le premier jour de la semaine en utilisant: CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek –

+10

En fait, le premier jour de la semaine selon la culture est sans intérêt dans ce cas; l'OP veut le lundi de la semaine, pas le premier jour de la semaine. –

6

Quelque chose comme ça fonctionnerait

DateTime dt = DateTime.Now; 
while(dt.DayOfWeek != DayOfWeek.Monday) dt = dt.AddDays(-1); 

Je suis sûr qu'il ya un plus belle façon tho :)

0

Essayez ceci:

public DateTime FirstDayOfWeek(DateTime date) 
{ 
    var candidateDate=date; 
    while(candidateDate.DayOfWeek!=DayOfWeek.Monday) { 
     candidateDate=candidateDate.AddDays(-1); 
    } 
    return candidateDate; 
} 

EDIT complet: surcharge pour la date d'aujourd'hui:

public DateTime FirstDayOfCurrentWeek() 
{ 
    return FirstDayOfWeek(DateTime.Today); 
} 
+0

Pourquoi boucler ??, il ya des façons de le faire sans boucle.Voir les réponses ci-dessous –

53

La réponse Pondium peut rechercher avant dans certains cas. Si vous souhaitez que la recherche en arrière, je pense qu'il devrait être:

DateTime input = //... 
int delta = DayOfWeek.Monday - input.DayOfWeek; 
if(delta > 0) 
    delta -= 7; 
DateTime monday = input.AddDays(delta); 
+3

Cela devrait être la bonne réponse car il gère le dimanche, à savoir FirstDayOfWeek est le lundi, donc si dimanche est la date d'entrée, il devrait retourner le lundi avant, mais pas la réponse acceptée. –

+1

+1 Si le 'input' est 01/01/2017 (un dimanche) ce code donne le 26/12/2016 comme le premier jour de la semaine! Pas 2/1/2017 (que la réponse acceptée donne!) –

+0

Cela fonctionne également pour 01/01/2019 = 31/12/2018! –

1
var now = System.DateTime.Now; 

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date; 

sera probablement vous revenir avec lundi. Sauf si vous utilisez une culture où le lundi n'est pas le premier jour de la semaine.

3

Qu'en est-:

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 

Pourquoi ne pas utiliser la solution native?

+2

La question est d'obtenir la date spécifique (c.-à-d. 2015-11-20) non le jour défini comme le premier jour. –

4
public static class DateTimeExtension 
{ 
    public static DateTime GetFirstDayOfWeek(this DateTime date) 
    { 
     var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; 

     while (date.DayOfWeek != firstDayOfWeek) 
     { 
      date = date.AddDays(-1); 
     } 

     return date; 
    } 
} 

International ici. Je pense que la prolongation peut être plus utile.

Questions connexes