20 votes

Comment puis-je vérifier si le jour actuel est un jour ouvrable

J'ai une application qui doit être exécutée pendant les jours ouvrés et pendant les heures de travail.

Dans la configuration de l'application, j'ai défini l'heure de début au format

Lundi-Vendredi
9h00-17h30

Maintenant, j'ai un problème pour vérifier si le jour actuel est dans la plage de jours (pour l'heure c'est facile - analyser l'heure avec DateTime.ParseExact et une simple branche suffira), mais je ne sais pas comment faire pour analyser les jours.

J'ai essayé avec :

JourSemaine jour = DateTime.Now.DaySemaine;
if (jour >= (JourSemaine)Enum.Parse(typeof(JourSemaine), sr.jour_debut) &&
    jour <= (JourSemaine)Enum.Parse(typeof(JourSemaine), sr.jour_fin))
{ /* OK */ }

sr.jour_debut et sr.jour_fin sont des chaînes de caractères

mais le problème est survenu lors des tests du week-end - apparemment, dans l'énumération JourSemaine, le dimanche est le premier jour de la semaine (voir les commentaires sur la page MSDN

Je suppose que je pourrais faire quelques gymnastiques avec le code actuel, mais je recherche le code le plus lisible possible.

Édition Désolé pour le malentendu - les jours ouvrés ne vont pas du lundi au vendredi - ils sont définis sous forme de chaînes dans le fichier de configuration, et ils peuvent même aller du vendredi au samedi - ce qui casse mon code original.

16voto

Hogan Points 30189
si ((jour >= DayOfWeek.Lundi) && (jour <= DayOfWeek.Vendredi))
{
    // action
}

12voto

Nemanja Boric Points 11853

De commentaire de Hans Passant sur ma question initiale :

Il suffit d'ajouter 7 à la fin du jour si celui-ci est inférieur au jour de début. De même, ajoutez 7 au jour si celui-ci est inférieur au jour de début.

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
}

5voto

Mustafa Gülmez Points 141

Extension pour DateTime

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

0voto

Michael Points 1

Ceci est une solution élégante pour le problème. C'est une classe qui peut facilement être importée dans d'autres projets. Le codage permet au programmeur d'assigner dynamiquement les jours à vérifier et de les passer sous forme de tableau de chaînes à la classe. Les données peuvent provenir d'une base de données ou être codées en dur lors de leur passage à une instance de cette classe pour le traitement. Elle renvoie les valeurs True si vous êtes en congé et False si vous travaillez ce jour-là. Ci-dessous la classe, j'ai fourni un exemple simple d'implémentation. Cette classe offre : Allocation dynamique des jours de congé, Gestionnaire d'erreurs simple en mettant les chaînes en minuscules avant de les comparer, Intégration facile avec une base de données contenant votre horaire de travail où vos jours de congé ne sont pas toujours les mêmes. Intégration facile en tant que nombre de jours de congé codé en dur.

// La classe pour vérifier si vous êtes en congé

class DayOffChecker
{
    public bool CheckDays(List DaysOff)
    {
        string CurrentDay = DateTime.Now.DayOfWeek.ToString();
        CurrentDay.ToLower();
        foreach (string DayCheck in DaysOff)
        {
            DayCheck.ToLower();
            if (CurrentDay == DayCheck)
            {
                return (true);
            }
        }
        return (false);
    }
}

// Exemple d'utilisation :

class Program
{
    List DaysOff = List();
    DaysOff.Add("Samedi");  // Ajoutez quelques valeurs à notre liste.
    DaysOff.Add("Dimanche");
    DayOffChecker CheckToday = new DayOffChecker();
    if(CheckToday.CheckDays(DaysOff))
    {
        Console.WriteLine("Vous êtes en congé aujourd'hui !!!");
    }
}

0voto

Nous pouvons également suivre une approche similaire pour vérifier si une heure donnée se situe entre deux heures. Voici l'algorithme

checkIfFallsInRange(index,start,end)

bool normalPattern = start <= end ;

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X