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