Pregunta

Dada una pieza estándar de información de programación, tales como "el segundo martes de junio 2009" o "el último viernes en julio de 2009", ¿cuál es la fórmula más simple y más eficiente para traducir eso en una fecha?

Entradas:

  • w = semana del mes, la enumeración (1º, 2º, Tercero, cuarto o último)
  • d = Día de la semana, enumeración Sol a través de Sat
  • m = mes, entero
  • y = Año, entero

Edit (nuevo) - No importa qué día de la semana comienza el; Quiero conseguir el w ª instancia de d en el mes dado. Así, el segundo domingo de junio de 2009 es 14 de junio a pesar de que, técnicamente, cae en la tercera semana de junio; Del mismo modo el primero domingo de junio es el 7 de junio no es nulo / excepción.

¿Fue útil?

Solución

Algo así como:

static DateTime GetDate(int year, int month, DayOfWeek dayOfWeek,
        int weekOfMonth) {
    // TODO: some range checking (>0, for example)
    DateTime day = new DateTime(year, month, 1);
    while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1);
    if (weekOfMonth > 0) {
        return day.AddDays(7 * (weekOfMonth - 1));
    } else { // treat as last
        DateTime last = day;
        while ((day = day.AddDays(7)).Month == last.Month) {
            last = day;
        }
        return last;
    }
}

Otros consejos

Editado para corregir el bug cuando los días de semana pidió fue igual que el día de la semana del primer día del mes.

segunda edición para fijar el disco tema' por Marc

static DateTime GetDate(int year, int month, 
                DayOfWeek weekDay, int week)
{  
    DateTime first = new DateTime(year, month, 1);
    int iDow = (int)weekday, iFirst = (int)first.DayOfWeek;
    int adjust = (7+iDow-iFirst)%7 - 7;
    return first.AddDays(7*week + adjust);
}
using System;

namespace date_using_week_of_month
{

    public class Example
    {
        public static DateTime WthDayDOfMonthM( int w, DayOfWeek d, DateTime month )
        {
            return first( d, month ).AddDays( 7 * (w - 1) );
        }

        private static DateTime first( DayOfWeek d, DateTime month )
        {
            DateTime first = new DateTime(
                month.Year, month.Month, 1 );
            while ( first.DayOfWeek != d )
            {
                first = first.AddDays( 1 );
            }
            return first;
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top