2012-07-15 23 views
17

Tengo una aplicación que debe ejecutarse en días hábiles y dentro de las horas de trabajo.¿Cómo puedo comprobar si el día actual es día laborable

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

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

Ahora, tengo un problema de cómo comprobar si el día actual está dentro de los días se boundare (por el momento es fácil - analizar el tiempo con DateTime.ParseExact y branch simple), pero no sé cómo analizar los días.

He probado 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 se produjo durante las pruebas de fin de semana - al parecer, en DayOfWeekenum, domingo es el primer día de la semana (refiriéndose a los comentarios en MSDN page

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

Editar Lo siento por el malentendido - días de trabajo no son de lunes a viernes - se definen como cadenas en el archivo de configuración, y pueden ser incluso de viernes a sábado - el cual rompe el código original.

+2

Simplemente agregue 7 al día final si es menor que el día de inicio. Del mismo modo, agregue 7 al día si es menor que el día de inicio. –

+0

@HansPassant, sí, esto funciona! ¡Si puede, publique la respuesta y la seleccionaré! –

+3

Continúa y publica el código que usaste y márcalo como la respuesta. –

Respuesta

10

De Hans Passant's comentario en mi pregunta original:

Apenas añada 7 días a la final si es menor que el día de inicio. Del mismo modo, agrega 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 
} 
+0

+1 esto resuelve el caso general. – Hogan

+0

+1. Esto es bastante controvertido, de lo contrario, un testamento de que C# es un lenguaje que hace el trabajo. Me gusta. –

+0

esto no responde la pregunta .... – markthewizard1234

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

Esto no funciona y creo que es el mismo que mi código original. Por ejemplo, si configuro mi computadora el sábado y si configuro end_day al domingo. –

+0

Veo ... por lo que no quiere saber si es un día hábil que desea saber si está entre dos cadenas en las variables sr.start_day y sr.end_day. – Hogan

+0

Sí, lo siento si no estaba claro en mi pregunta. –

-1

La línea de abajo volverá "Sunday"

string nameOfTheDay = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("en-GB")).ToLower(); 

if(nameOfTheDay != "sunday" && nameOfTheDay != "saturday") 
{ 
//Do Stuff 
} 
+0

-1: Si bien esto es cierto para (¿la mayoría?) Países occidentales, no funcionaría en muchos países. Ver en.wikipedia.org/wiki/Workweek_and_weekend. – joce

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

-1: Si bien esto es cierto para (¿la mayoría?) Países occidentales, no funcionaría en muchos países. Ver https://en.wikipedia.org/wiki/Workweek_and_weekend. – joce

4

extensión de DateTime

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

¿devuelve una matriz de booleanos? – Hogan

+1

@Hogan Mustafa crea una nueva matriz de instancias 'DayOfWeek' en la que llama' Contains() 'que a su vez devuelve' bool'. Perfectamente legal. Sin embargo, tenga en cuenta que necesitará importar 'System.Linq' para que esto funcione. – rumblefx0

0

Ésta es una solución elegante para el problema. Es una clase que se puede importar fácilmente en 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 estar codificados cuando los pasa a una instancia de esta clase para su procesamiento. Devuelve los valores de Verdadero si no trabajas y Falso si trabajas ese día. Debajo de la clase proporcioné un ejemplo simple de implementación. Características de esta clase: Asignación dinámica de los días que tiene desactivado, Manejador de errores simple configurando cadenas a minúsculas antes de compararlas, Se integra fácilmente con una base de datos que tiene su horario de trabajo donde sus días libres pueden no ser siempre los mismos. Fácilmente integrado 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!!!"); 
    } 
} 
0

También podemos seguir un enfoque similar para verificar si una hora determinada es entre dos horas. A continuación se presenta el algoritmo

checkIfFallsInRange(index,start,end) 

bool normalPattern = start <= end ; 

if (normalPattern) 
    return index>=start && index<=end; 
else 
    return index>=start || index <=end; 
0

Mi solución sencilla para determinar si el día actual es un día de trabajo 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); 
} 

Asume Domingo/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 podría crearse un indicador de bit.

-1
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 
} 
+1

Por favor, elimine su enlace de Twitter. Es injustificado. Además, se justifica cierta explicación, las respuestas que consisten únicamente en un fragmento de código no son buenas respuestas. – Flater

+1

No agregue su enlace de Twitter de nuevo a esta (ni a ninguna otra) respuesta. – ChrisF

+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – Isma

Cuestiones relacionadas