2009-11-03 13 views
56

Mi stavo chiedendo se voi ragazzi sapete come ottenere la data del lunedì della settimana delle correnti in base alla data odierna?Ottieni la data del primo lunedì della settimana?

cioè 2009-11-03 passato e 2009-11-02 ottiene rinviato indietro

/M

+1

Dai un'occhiata a questa domanda: http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week –

risposta

125

Questo è quello che uso (probabilmente non internazionalizzata):

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

Sì, infatti: Non internazionalizzato. Il lunedì non è sempre il primo giorno della settimana. –

+15

È possibile ottenere il primo giorno della settimana utilizzando: CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek –

+10

In realtà il primo giorno della settimana in base alla cultura non interessa in questo caso; l'OP vuole il lunedì della settimana, non il primo giorno della settimana. –

6

Qualcosa di simile potrebbe funzionare

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

Sono sicuro che c'è un modo più bello tho :)

0

Prova questo:

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

EDIT per completezza: sovraccarico per la data odierna:

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

Perché il ciclo ??, ci sono modi per farlo senza un ciclo.Vedi le risposte di seguito. –

53

La risposta Pondium può cercare in avanti in alcuni casi. Se si desidera solo Ricerca all'indietro penso che dovrebbe essere:

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

Questa dovrebbe essere la risposta corretta in quanto gestisce la domenica, cioè FirstDayOfWeek è lunedì, quindi se domenica è la data di immissione dovrebbe restituire il lunedì prima. La risposta accettata no. –

+1

+1 Se l'input è 1/1/2017 (una domenica), questo codice restituisce il 26/12/2016 come primo giorno della settimana! Non 1/1/2017 (che la risposta accettata dà!) –

+0

Funziona anche per 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; 

Probabilmente tornerà con Lunedi. A meno che non si stia utilizzando una cultura in cui il lunedì non è il primo giorno della settimana.

3

Che dire:

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 

Perché non utilizzare soluzione nativa?

+2

La domanda è di ottenere la data specifica (es. 2015-11-20) non il giorno in cui è definito come il primo giorno. –

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; 
    } 
} 

Internazionale qui. Penso che come estensione possa essere più utile.

Problemi correlati