2011-09-30 22 views
37

Eventuali duplicati:
ASP.net get the next tuesdayCome ottenere la data della prossima domenica?

Dato un giorno del mese, come posso ottenere la prossima domenica da quel giorno?

Quindi, se passerò martedì 13 settembre 2011, tornerà il 18 settembre.

+5

leggere la proprietà 'DayOfWeek'. Calcola quanti giorni prima di domenica è questo. Chiama "AddDays" che passa quel numero. –

+0

È un esercizio di compiti a casa? Se è così, tagga la domanda con il tag 'homework' –

+1

cosa c'è che non va se ho appena un ciclo, e incrementare il giorno e controllare se è il giorno desiderato? rompi se lo è. – codecompleting

risposta

74

Io uso questo metodo di estensione:

public static DateTime Next(this DateTime from, DayOfWeek dayOfWeek) 
    { 
     int start = (int)from.DayOfWeek; 
     int target = (int)dayOfWeek; 
     if (target <= start) 
      target += 7; 
     return from.AddDays(target - start); 
    } 
+0

Non sta usando i valori sottostanti di un Enum pericoloso? –

+3

+1 per renderlo un metodo di estensione –

+5

@Spencer K: Dipende, in caso di giorni della settimana, sarei molto sorpreso che cambierebbe nel prossimo (o anche lontano) futuro ;-) –

3
/// <summary> 
/// Finds the next date whose day of the week equals the specified day of the week. 
/// </summary> 
/// <param name="startDate"> 
/// The date to begin the search. 
/// </param> 
/// <param name="desiredDay"> 
/// The desired day of the week whose date will be returneed. 
/// </param> 
/// <returns> 
/// The returned date is on the given day of this week. 
/// If the given day is before given date, the date for the 
/// following week's desired day is returned. 
/// </returns> 
public static DateTime GetNextDateForDay(DateTime startDate, DayOfWeek desiredDay) 
{ 
    // (There has to be a better way to do this, perhaps mathematically.) 
    // Traverse this week 
    DateTime nextDate = startDate; 
    while(nextDate.DayOfWeek != desiredDay) 
     nextDate = nextDate.AddDays(1D); 

    return nextDate; 
} 

Fonte:

http://angstrey.com/index.php/2009/04/25/finding-the-next-date-for-day-of-week/

23

date.AddDays(7 - (int)date.DayOfWeek) dovrebbe farlo credo.

date.DayOfWeek restituirà un valore enum che rappresenta il giorno (dove 0 è domenica).

+0

Ho fatto una piccola modifica su di esso ha funzionato bene per me. DateTime.Today.AddDays (7 - (int) DayOfWeek.Saturday) .ToShortDateString() – dvdmn

+7

Dvdnhm attento, che aggiunge solo 1 giorno alla data odierna. – Joey

+0

grazie per la preoccupazione, ha funzionato bene per il mio scopo e usandolo nel progetto .. – dvdmn

5
 var date = DateTime.Now; 
     var nextSunday = date.AddDays(7 - (int) date.DayOfWeek);  

Se avete bisogno di più vicino domenica, codice po 'diverso (come se siete su domenica, domenica più vicina è oggi):

var nearestSunday = date.AddDays(7 - date.DayOfWeek == DayOfWeek.Sunday ? 7 : date.DayOfWeek); 
2

Ecco il codice:

int dayOfWeek = (int) DateTime.Now.DayOfWeek; 
DateTime nextSunday = DateTime.Now.AddDays(7 - dayOfWeek).Date; 

Ottieni prima il valore numerico del giorno della settimana, nel tuo esempio: Martedì = 2

Quindi sottrarre da domenica, 7 -2 = 5 giorni da aggiungere per ottenere la prossima domenica. :)

0
DateTime dt=dateTime; 
do { 
    dt=dt.AddDays(1); 
} while(dt.DayOfWeek!= DayOfWeek.Sunday); 
// 'dt' is now the next Sunday 

La domanda non è chiara se viene restituita la stessa data se la data è già una domenica; Presumo di no, ma cambia il ciclo precedente in un ciclo while se sbaglio.

0

Esempio utilizzando la ricorsione

private static DateTime GetNextSunday(DateTime dt) 
    { 
     var tomorrow = dt.AddDays(1); 
     if (tomorrow.DayOfWeek != DayOfWeek.Sunday) 
     { 
      GetNextSunday(tomorrow); 
     } 

     return tomorrow; 
    } 
+2

Cura di commentare downvoter? Odio quando le persone lo fanno ... –

+0

Anch'io lo odio! Tuttavia, penso che questo non avrebbe funzionato bene. Come accennato, le istanze DateTime sono immutabili e non si utilizza nemmeno il valore restituito del metodo. Un'altra cosa da dire: è davvero bello mettere questo tipo di funzionalità nei metodi di estensione, almeno per i miei gusti. – Kjellski

0
public static DateTime GetNextSunday (DateTime date) 
{ 
    if (date.DayOfWeek == DayOfWeek.Sunday) 
      date = date.AddDays(1); 
    while (date.DayOfWeek != DayOfWeek.Sunday) 
      date = date.AddDays(1); 

    return date; 
} 
+0

Stai aggiungendo 1 giorno indipendentemente dal giorno corrente ... – Joey

+0

Aggiungo 1 giorno se è attualmente domenica (presumo che se è domenica, l'OP vuole la domenica successiva), quindi continua ad aggiungere giorni fino a quando non è Domenica. Quindi torna quel giorno. A meno che non manchi qualcosa. – MattW

Problemi correlati