Rechercher si l'heure actuelle tombe dans une plage de temps

147

Utilisation de .NET 3.5

Je veux déterminer si l'heure actuelle se situe dans une plage de temps.

Jusqu'à présent, j'ai l'heure actuelle:

DateTime currentTime = new DateTime();
currentTime.TimeOfDay;

Je ne sais pas comment convertir et comparer l'intervalle de temps. Cela fonctionnerait-il?

if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay 
    && Convert.ToDateTime("13:01") >= currentTime.TimeOfDay)
{
   //match found
}

UPDATE1: Merci à tous pour vos suggestions. Je n'étais pas familier avec la fonction TimeSpan.

John M
la source
Dupliquer: stackoverflow.com/questions/1408165/…
Alfred Myers
3
Avez-vous besoin de vous préoccuper de traverser minuit?
gjutras
1
traverser minuit n'est pas un problème, mais tout ce qui s'étend sur minuit est certainement un fléau de mon expérience de programmation ...
John M

Réponses:

258

Pour vérifier une heure de la journée, utilisez:

TimeSpan start = new TimeSpan(10, 0, 0); //10 o'clock
TimeSpan end = new TimeSpan(12, 0, 0); //12 o'clock
TimeSpan now = DateTime.Now.TimeOfDay;

if ((now > start) && (now < end))
{
   //match found
}

Pour les temps absolus, utilisez:

DateTime start = new DateTime(2009, 12, 9, 10, 0, 0)); //10 o'clock
DateTime end = new DateTime(2009, 12, 10, 12, 0, 0)); //12 o'clock
DateTime now = DateTime.Now;

if ((now > start) && (now < end))
{
   //match found
}
Frank Bollack
la source
Comment compter le nombre de matchs? Par exemple, je veux compter le nombre de samedis et de dimanches dans la plage.
pbies
@pmbiesiada: Cela sort complètement du cadre de la question initiale (et de la réponse). Vous devriez en faire une nouvelle question, mais faites une recherche ici sur SO si quelque chose comme ça a déjà été répondu. Bonne chance.
Frank Bollack
1
Et s'il y a des heures différentes pour des jours différents? Y a-t-il un moyen facile de comparer cela? stackoverflow.com/questions/22769557/…
SearchForKnowledge
@SearchForKnowledge: Comparer pour quoi? Veuillez être plus précis sur ce que vous voulez accomplir ou donner quelques exemples.
Frank Bollack
4
La réponse ci-dessous devrait être celle acceptée ... Celle-ci ne vérifie pas les délais sur plusieurs jours, par exemple de 22:00:00 à 02:00:00 ...
FranzHuber23
118

Quelques bonnes réponses ici, mais aucune ne couvre le cas de votre heure de début étant un jour différent de votre heure de fin. Si vous avez besoin de chevaucher la limite du jour, quelque chose comme ceci peut vous aider:

TimeSpan start = TimeSpan.Parse("22:00"); // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");   // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

if (start <= end)
{
    // start and stop times are in the same day
    if (now >= start && now <= end)
    {
        // current time is between start and stop
    }
}
else
{
    // start and stop times are in different days
    if (now >= start || now <= end)
    {
       // current time is between start and stop
    }
}

Notez que dans cet exemple, les limites de temps sont inclusives et que cela suppose toujours moins de 24 heures de différence entre startet stop.

pseudo
la source
1
Et s'il y a des heures différentes pour des jours différents? Y a-t-il un moyen facile de comparer cela? stackoverflow.com/questions/22769557/…
SearchForKnowledge
Bon point, cela a du sens. Si le temps mesuré passe par minuit, ce serait la seule réponse qui serait toujours correcte.
Sunsetquest
1
merci, après les heures où j'ai essayé 11:57 pmet cela a fonctionné: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
1
Merci pour ça. La réponse semble simple à trouver, mais c'est un peu difficile à conceptualiser.
Sam I am dit Réintégrer Monica le
C'est une excellente réponse. J'écris une méthode pour déterminer si l'heure d'une donnée DateTimetombe dans les heures ouvrables spécifiées. Les heures d'ouverture peuvent être le même jour, mais elles peuvent également s'étendre sur deux jours (par exemple, de 15 h à 1 h du matin).
Tiré le
17
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >=  currentTime.TimeOfDay)
{
   //match found
}

si vous voulez vraiment analyser une chaîne dans un TimeSpan, vous pouvez utiliser:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");
JDunkerley
la source
merci, après les heures où j'ai essayé 11:57 pmet cela a fonctionné: TimeSpan time = new TimeSpan(23, 57, 00); DateTime date_with_time = mydate.Add(time);
shaijut
16

Une petite fonction d'extension simple pour cela:

public static bool IsBetween(this DateTime now, TimeSpan start, TimeSpan end)
{
    var time = now.TimeOfDay;
    // If the start time and the end time is in the same day.
    if (start <= end)
        return time >= start && time <= end;
    // The start time and end time is on different days.
    return time >= start || time <= end;
}
André Snede Kock
la source
3
Bonne addition Andre. Je n'aurais pas pensé à faire une comparaison OU pour le cas de différents jours.
David
3
Super petit morceau de code mais un problème avec lui. Que faire si vous spécifiez la même heure de début et de fin. Une hypothèse est que cela peut signifier qu'il devrait s'étendre sur une période de 24 heures, ce qui signifie que votre état start <= enddoit être modifié start < endet une autre hypothèse pourrait être que c'est le même jour, mais si tel est le cas, il échouera probablement si vous utilisez Now.TimeOfDay car il inclut les millisecondes et provoque le dépassement de la plage.
Thierry
@Thierry Nice catch :) Vous êtes invités à essayer de le réparer.
André Snede Kock
14

Essayez d'utiliser l'objet TimeRange en C # pour atteindre votre objectif.

TimeRange timeRange = new TimeRange();
timeRange = TimeRange.Parse("13:00-14:00");

bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay);
Console.Write(IsNowInTheRange);

Voici où j'ai eu cet exemple d'utilisation de TimeRange

ragoût
la source
12
TimeRange n'est pas une classe d'une bibliothèque C #. C'est une classe externe qui peut être téléchargée via le lien ci-dessus.
Jpsy
6

La TimeOfDaypropriété renvoie une TimeSpanvaleur.

Essayez le code suivant:

TimeSpan time = DateTime.Now.TimeOfDay;

if (time > new TimeSpan(11, 59, 00)        //Hours, Minutes, Seconds
 && time < new TimeSpan(13, 01, 00)) {
    //match found
}

En outre, new DateTime()est identique à DateTime.MinValueet sera toujours égal à 1/1/0001 12:00:00 AM. (Les types de valeur ne peuvent pas avoir de valeurs par défaut non vides) Vous souhaitez utiliser DateTime.Now.

SLaks
la source
2

Vous êtes très proche, le problème est que vous comparez un DateTime à un TimeOfDay. Ce que vous devez faire est d'ajouter la propriété .TimeOfDay à la fin de vos fonctions Convert.ToDateTime ().

Michael La Voie
la source
2

Cela sera-t-il plus simple pour gérer le cas de limite de jour? :)

TimeSpan start = TimeSpan.Parse("22:00");  // 10 PM
TimeSpan end = TimeSpan.Parse("02:00");    // 2 AM
TimeSpan now = DateTime.Now.TimeOfDay;

bool bMatched = now.TimeOfDay >= start.TimeOfDay &&
                now.TimeOfDay < end.TimeOfDay;
// Handle the boundary case of switching the day across mid-night
if (end < start)
    bMatched = !bMatched;

if(bMatched)
{
    // match found, current time is between start and end
}
else
{
    // otherwise ... 
}
Elliott
la source
0

En utilisant Linq, nous pouvons simplifier cela par ceci

 Enumerable.Range(0, (int)(to - from).TotalHours + 1)
            .Select(i => from.AddHours(i)).Where(date => date.TimeOfDay >= new TimeSpan(8, 0, 0) && date.TimeOfDay <= new TimeSpan(18, 0, 0))
Edu Cielo
la source
0
 using System;

 public class Program
 {
    public static void Main()
    {
        TimeSpan t=new TimeSpan(20,00,00);//Time to check

        TimeSpan start = new TimeSpan(20, 0, 0); //8 o'clock evening

        TimeSpan end = new TimeSpan(08, 0, 0); //8 o'clock Morning

        if ((start>=end && (t<end ||t>=start))||(start<end && (t>=start && t<end)))
        {
           Console.WriteLine("Mached");
        }
        else
        {
            Console.WriteLine("Not Mached");
        }

    }
 }
Patel Vishal
la source