una saber para habil festivos fecha dias como c#

c# - para - como saber si una fecha es dia habil en excel



¿Cómo puedo comprobar si el día actual es día laborable? (10)

Del comentario de Hans Passant sobre mi pregunta original:

Solo agregue 7 al día final si es menor que el día de inicio. De manera similar, agregue 7 al día si es menor que el día de inicio.

DayOfWeek day = DateTime.Now.DayOfWeek; DayOfWeek start_day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.start_day); DayOfWeek end_day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.end_day); if (end_day < start_day) end_day += 7; if (day < start_day) day += 7; if (day >= start_day && day <= end_day) { //Action }

Tengo una aplicación que debe ejecutarse en días laborables y dentro de las horas de trabajo.

En la configuración de la aplicación, he establecido la hora de inicio en formato

Monday-Friday 9:00AM-5:30PM

Ahora, tengo un problema sobre cómo verificar si el día actual está dentro del límite de días (porque la hora es fácil: analizar el tiempo con DateTime.ParseExact y la simple rama), pero no sé cómo analizar los días.

Lo he intentado con:

DayOfWeek day = DateTime.Now.DayOfWeek; if (day >= (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.start_day) && day <= (DayOfWeek)Enum.Parse(typeof(DayOfWeek), sr.end_day)) { /* OK */ }

sr.start_day y sr.end_day son cadenas

pero el problema ocurrió durante las pruebas de fin de semana, aparentemente, en la enum DayOfWeek , el domingo es el primer día de la semana (refiriéndose a los comentarios en la página de MSDN

Supongo que podría hacer algo de gimnasia con el código actual, pero estoy buscando el código más legible disponible.

Editar Perdón por el malentendido, los días laborables no son de lunes a viernes, se definen como cadenas en el archivo de configuración y pueden ser parejos de viernes a sábado, lo que rompe mi código original.


Esta es una solución elegante para el problema. Es una clase que se puede importar fácilmente a otros proyectos. La codificación permite al programador asignar dinámicamente los días para verificar y pasarlos como una matriz de cadenas a la clase. Los datos pueden provenir de una base de datos o ser codificados al pasarlos a una instancia de esta clase para su procesamiento. Devuelve los valores de Verdadero si estás fuera del trabajo y Falso si trabajas ese día. Debajo de la clase proporcioné un ejemplo simple de implementación. Esta clase presenta: Asignación dinámica de los días que tiene desactivados, Manejador de errores simple al establecer cadenas en minúsculas antes de compararlos, Se integra fácilmente con una base de datos que tiene su horario de trabajo donde sus días libres no siempre son iguales. Se integra fácilmente como un número codificado de días libres.

// The Class To Check If You''re Off Work class DayOffChecker { public bool CheckDays(List<string> DaysOff) { string CurrentDay = DateTime.Now.DayOfWeek.ToString(); CurrentDay.ToLower(); foreach (string DayCheck in DaysOff) { DayCheck.ToLower(); if (CurrentDay == DayCheck) { return (true); } } return (false); } } // Example usage code: class Program { List<string> DaysOff = List<string>(); DaysOff.Add("Saturday"); // Add some values to our list. DaysOff.Add("Sunday"); DayOffChecker CheckToday = new DayOffChecker(); if(CheckToday.CheckDays(DaysOff)) { Console.WriteLine("You''re Off Today!!!"); } }


La línea de abajo devolverá "domingo"

string nameOfTheDay = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("en-GB")).ToLower(); if(nameOfTheDay != "sunday" && nameOfTheDay != "saturday") { //Do Stuff }


Mi solución simple para determinar si el día actual es un día laboral o no es:

public static bool IsWorkDay(this DateTime dt) { return IsWorkDay(dt, DayOfWeek.Sunday, DayOfWeek.Saturday); } public static bool IsWorkDay(this DateTime dt, params DayOfWeek[] noneWorkDays) { return !noneWorkDays.Contains(dt.DayOfWeek); }

Se asume que los domingos / sábados son días no laborables. De lo contrario, el usuario puede especificar los días no laborables. Y es una extensión para fácil de usar.

Nota: Para evitar un bucle se podría crear una bandera de bit.



También podemos seguir un enfoque similar para verificar si una hora determinada es entre dos horas. Siguiente es el algoritmo

checkIfFallsInRange(index,start,end) bool normalPattern = start <= end ; if ( normalPattern) return index>=start && index<=end; else return index>=start || index <=end;


extensión para DateTime

public static bool IsWeekend(this DateTime date) { return new[] {DayOfWeek.Sunday, DayOfWeek.Saturday}.Contains(date.DayOfWeek); }


if ((day >= DayOfWeek.Monday) && (day <= DayOfWeek.Friday)) { // action }


public bool IsWeekend(DateTime dateToCheck) { DayOfWeek day = (DayOfWeek) dateToCheck.Day; return ((day == DayOfWeek.Saturday) || (day == DayOfWeek.Sunday)); }


DayOfWeek Day = DateTime.Today.DayOfWeek; int Time = DateTime.Now.Hour; if (Day != DayOfWeek.Saturday && Day != DayOfWeek.Sunday) { if (Time >= 8 && Time <= 16) { //It is Weekdays work hours from 8 AM to 4 PM { } else { // It is Weekend }