2010-07-19 22 views
10

Duplicar posible:
How do I determine if a given date is Nth weekday of the month?obtener enésimo día de la semana del mes en C#

¿Cómo consigo el día de la semana enésima del mes?

Por ej .:

segundo lunes de "Julio 2010" = 07/12/2010.

Buscando una función como:

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

de lo anterior, los parámetros de la función serán ("Cualquier fecha en julio de 2010", 2, lunes).

+0

No está claro lo que la entrada y salida que se puede esperar aquí. Por favor aclara –

+0

Agregué una respuesta a una pregunta similar que devuelve una lista de DateTime, en caso de que necesite más que un solo DateTime en http://stackoverflow.com/questions/288513/how-do-i-determine-if-a -dont-date-is-the-nth-weekday-of-the-month/35584324 # 35584324 –

Respuesta

20

utilizar el método de extensión siguiente:

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

entonces usted puede escribir

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

O, como una función:

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

(tengo que restar uno porque date.Next(dayOfWeek) ya es la primera aparición de ese día)

+0

El OP no especificó lo que debería suceder si el n-ésimo día ya no está dentro del mes deseado, pero creo que la entrada debe validarse de alguna manera. –

+0

@SLaks, gracias por la respuesta. @ 0xA3, también he validado la entrada de tal manera que, si el número de la semana es> 4, obtendré la última semana del mes. – Prasad

+0

Brilliant Code - ¡gracias! Punto Muy Muy Menor ... Para usar en el código ... cambie "dayofWeek" en la última función "GetNthWeekofMonth" a dayOfWeek ... (con mayúscula en "O" para que coincida con la línea siguiente). –

2

Un posible algoritmo:

  1. Iniciar en el día 1 del mes.
  2. Avanzar un día a la vez hasta obtienes el día de la semana en el que buscas .
  3. Agregue (7 * N) a la fecha en que está en obtenga la fecha que desee.
+1

En lugar del paso (2), puede encontrar qué día de la semana es el primer día y agregar el número de días requerido hasta ese día. Por ejemplo, si el primero es un martes, usted sabe que el primer lunes sería el séptimo (+6). En general, si define sus días con lunes = 1, martes = 2, ..., domingo = 7 Una fórmula para el primer día X del mes sería la función por partes: X-Y + 1 si X> Y 8-Y + X si 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 bucle es completamente innecesario aquí. – SLaks

Cuestiones relacionadas