fórmula simple para determinar la fecha utilizando semana del mes?
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.
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;
}
}
}