Si no es necesario tener en cuenta las vacaciones, yo sugeriría que hacer algo como esto:
public static DateTime AddWorkingDays(DateTime specificDate,
int workingDaysToAdd)
{
int completeWeeks = workingDaysToAdd/5;
DateTime date = specificDate.AddDays(completeWeeks * 7);
workingDaysToAdd = workingDaysToAdd % 5;
for (int i = 0; i < workingDaysToAdd; i++)
{
date = date.AddDays(1);
while (!IsWeekDay(date))
{
date = date.AddDays(1);
}
}
return date;
}
private static bool IsWeekDay(DateTime date)
{
DayOfWeek day = date.DayOfWeek;
return day != DayOfWeek.Saturday && day != DayOfWeek.Sunday;
}
Es ineficiente, pero fácil de entender. Para una versión eficiente, calcularía el número de semanas completas para agregar como antes, pero luego tendrá un mapeo desde "día actual de la semana" y "días hábiles restantes para agregar" a "número de real días hasta añadir". Luego, podría calcular la cantidad total de días para agregar y hacerlo en una sola llamada.
EDITAR: En términos del nivel de ineficiencia ... realmente no es muy malo. Solo realizará verificaciones manuales de "es un fin de semana" durante un máximo de 4 días, lo cual no es tan malo. En particular, a pesar de las afirmaciones de igor (actual en el momento de la publicación), es bastante más rápido que su enfoque, a pesar de los puntos de referencia defectuosos;)
Tenga en cuenta que puede que aún no maneje las entradas negativas. No lo he comprobado.
Una de las razones detrás del enfoque que estoy usando es que no depende de que yo o el lector de códigos sepa cuáles son los valores en la enumeración DayOfWeek
. No me importa si es 0-6, 1-7, de lunes a domingo, de sábado a viernes ... o incluso si hay valores completamente extraños. Solo comparo por igualdad, lo que hace que el código sea más "obviamente correcto".
Jon, ¿sería más eficiente usar 'workingDaysToAdd = workingDaysToAdd% 5; date = date.AddDays (workingDaysToAdd); if (date.DayOfWeek == DayOfWeek.Saturday) date.AddDays (2); if (date.DayOfWeek == DayOfWeek.Sunday) date.AddDays (1); 'en lugar de la construcción del bucle? Sólo curioso. – Lazarus
Lo probé y funciona según lo que necesito exactamente. ¿Lo hiciste sobre la marcha? en menos de 5 minutos desde que lo publiqué ... hombre, eso es bastante increíble ... pero me gustaría obtener respuestas más eficientes ... gracias por cierto ... – CSharpNoob
No diría que es ineficiente, pero todas las cosas son relativas. La respuesta cuenta durante semanas por adelantado, por lo que lo máximo que tendrá que hacer es 6 veces (máximo 4 para workingDays% 5, max 2 para fines de semana). No fue un golpe tremendo. –