Trouvez si le temps actuel tombe dans un intervalle de temps
Question
Utilisation de .NET 3.5
Je veux déterminer si l'heure actuelle tombe dans un intervalle de temps.
Jusqu'à présent, j'ai le currentime:
DateTime currentTime = new DateTime();
currentTime.TimeOfDay;
Je découpage sur la façon d'obtenir l'intervalle de temps converti et comparé. Est-ce que ce travail?
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.
La solution
Pour la vérification pendant une durée d'utilisation de jour:
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 utiliser:
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
}
Autres conseils
Quelques bonnes réponses ici, mais pas couvrir le cas de votre temps de commencer à être dans un autre jour que votre temps final. Si vous devez enjamber la limite du jour, alors quelque chose comme ça 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 inclus et que cela suppose encore moins d'une différence de 24 heures 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 un TimeSpan, vous pouvez utiliser:
TimeSpan start = TimeSpan.Parse("11:59");
TimeSpan end = TimeSpan.Parse("13:01");
Une petite fonction d'extension simple pour ceci:
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 compléter 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
retourne TimeSpan
valeur .
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 le même que DateTime.MinValue
et sera toujours égal à 1/1/0001 12:00:00 AM
. (Types de valeur ne peuvent pas avoir des valeurs par défaut non vides) Vous voulez utiliser DateTime.Now
.
Vous êtes très proche, le problème est que vous comparez DateTime à un TimeOfDay. Ce que vous devez faire est d'ajouter la propriété .TimeOfDay à la fin de fonctions Convert.ToDateTime ().
Sera-ce plus simple pour traiter le cas 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 ...
}
LINQ nous pouvons simplifier par ce
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))
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");
}
}
}