2010-07-19 18 views
10

Eventuali duplicati:
How do I determine if a given date is Nth weekday of the month?ottenere giorno della settimana n-esima di mese in C#

Come faccio ad avere il giorno della settimana ennesima del mese?

Per es .:

2 ° Lunedi del "Luglio 2010" = 07/12/2010.

Alla ricerca di una funzione come:

public DateTime GetNthWeekofMonth(DateTime date, int nthWeek, DayOfWeek dayofWeek) 
{ 
//return the date of nth week of month 
} 

da quanto sopra, i parametri della funzione saranno ("Qualsiasi data nel luglio 2010", 2, Lunedi).

+0

Non è chiaro che cosa input e output che ci si aspetta qui. Si prega di precisare. –

+0

Ho aggiunto una risposta a una domanda simile che restituisce un elenco di DateTime, nel caso in cui sia necessario più di un singolo DateTime su http://stackoverflow.com/questions/288513/how-do-i-determine-if-a -given-date-is-the-nth-weekday-of-the-month/35584324 # 35584324 –

risposta

20

utilizzare il metodo seguente estensione:

public static class DateTimeExtensions 
{ 
    ///<summary>Gets the first week day following a date.</summary> 
    ///<param name="date">The date.</param> 
    ///<param name="dayOfWeek">The day of week to return.</param> 
    ///<returns>The first dayOfWeek day following date, or date if it is on dayOfWeek.</returns> 
    public static DateTime Next(this DateTime date, DayOfWeek dayOfWeek) { 
     return date.AddDays((dayOfWeek < date.DayOfWeek ? 7 : 0) + dayOfWeek - date.DayOfWeek); 
    } 
} 

Si può quindi scrivere

new DateTime(2010, 07, 01).Next(DayOfWeek.Monday).AddDays((2 - 1) * 7); 

Oppure, in funzione:

public DateTime GetNthWeekofMonth(DateTime date, int nthWeek, DayOfWeek dayOfWeek) { 
    return date.Next(dayOfWeek).AddDays((nthWeek - 1) * 7); 
} 

(Ho bisogno di sottrarre uno perché date.Next(dayOfWeek) è già la prima occorrenza di quel giorno)

+0

L'OP non ha specificato cosa dovrebbe accadere se il n ° giorno non è più nel mese desiderato, ma ritengo che l'input debba in qualche modo essere convalidato. –

+0

@SLaks, grazie per la risposta. @ 0xA3, ho anche convalidato l'input in modo tale che, se il numero della settimana è> 4, avrò l'ultima settimana del mese. – Prasad

+0

Codice brillante - grazie! Punto Molto Molto Minore ... Per usare nel codice ... cambia "dayofWeek" nell'ultima funzione "GetNthWeekofMonth" a dayOfWeek ... (capitalizzando la "O" per abbinare la linea che segue). –

2

Una possibile algoritmo:

  1. Si parte dal 1 ° del mese.
  2. Andare avanti di un giorno alla volta fino al si ottiene il giorno della settimana che stai cercando .
  3. Aggiungi (7 * N) alla data in cui sei su ottieni la data desiderata.
+1

Invece del passaggio (2), è possibile trovare quale giorno della settimana è il primo giorno e aggiungere il numero richiesto di giorni a quel giorno. Ad esempio, se il primo è un martedì, sai che il primo lunedì sarà il 7 (+6). In generale se si definiscono i giorni con lunedì = 1, martedì = 2, ..., domenica = 7 Una formula per il primo X giorno del mese sarebbe la funzione a tratti: X-Y + 1 se X> Y 8-Y + X se X Assaf

0
IEnumerable<DateTime> WeekdaysFrom(DateTime start) 
{ 
    DateTime weekday = start.Add(TimeSpan.FromDays(1)); 
    while(weekday < DateTime.MaxValue.Subtract(TimeSpan.FromDays(1))) 
    { 
     while(weekday.DayOfWeek == DayOfWeek.Saturday || weekday.DayOfWeek == DayOfWeek.Sunday) 
     { 
      weekday.Add(TimeSpan.FromDays(1)); 
     } 
     yield return weekday; 
    } 
} 

DateTime NthWeekday(DateTime month, int n) 
{ 
    return WeekdaysFrom(new DateTime(month.year, month.month, 1)).Skip(n-1).First(); 
} 
+1

Un ciclo è completamente inutile qui. – SLaks

Problemi correlati