web-dev-qa-db-fra.com

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

Utiliser .NET 3.5

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

Jusqu'ici j'ai le currentime:

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

Je ne sais pas comment convertir et comparer la plage 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 ne connaissais pas la fonction TimeSpan.

126
John M

Pour vérifier l'heure d'utilisation de la journée:

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
}
227
Frank Bollack

Quelques bonnes réponses ici mais aucune ne couvre le cas où votre heure de début est dans un jour différent de votre heure de fin. Si vous avez besoin de chevaucher la limite de jours, alors quelque chose comme ceci peut 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 start et stop.

103
Nick
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 TimeSpan, vous pouvez utiliser:

    TimeSpan start = TimeSpan.Parse("11:59");
    TimeSpan end = TimeSpan.Parse("13:01");
17
JDunkerley

Une simple petite fonction d'extension 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;
}
15
André Snede Kock

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

13
stewsha

La propriété TimeOfDay renvoie une valeur TimeSpan .

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
}

De plus, new DateTime() est identique à DateTime.MinValue Et 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 .

6
SLaks

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

2
Michael La Voie

Sera-ce plus simple pour gérer le jour limite? :)

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 ... 
}
1
Elliott
 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");
        }

    }
 }
0
Patel Vishal

En utilisant Linq, nous pouvons simplifier cela

 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))
0
Edu Cielo