Найти если текущее время попадает в диапазон времени
использование .Net 3.5 с
Я хочу определить, попадает ли текущее время в диапазон времени.
пока у меня есть текущее время:
DateTime currentTime = new DateTime();
currentTime.TimeOfDay;
я гасну о том, как получить диапазон времени преобразования и сравнения. Сработает ли это?
if (Convert.ToDateTime("11:59") <= currentTime.TimeOfDay
&& Convert.ToDateTime("13:01") >= currentTime.TimeOfDay)
{
//match found
}
UPDATE1: спасибо всем за ваши предложения. Я не был знаком с функцией TimeSpan.
9 ответов:
для проверки на время суток использовать:
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 }
для абсолютного времени использования:
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 }
некоторые хорошие ответы здесь, но ни один не охватывает случай вашего времени начала в другой день, чем ваше время окончания. Если вам нужно оседлать дневную границу, то что-то вроде этого может помочь:
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 } }
обратите внимание, что в этом примере временные границы являются включительными и что это все еще предполагает менее чем 24-часовую разницу между
start
иstop
.
if (new TimeSpan(11,59,0) <= currentTime.TimeOfDay && new TimeSpan(13,01,0) >= currentTime.TimeOfDay) { //match found }
Если вы действительно хотите разобрать строку в TimeSpan, то вы можете использовать:
TimeSpan start = TimeSpan.Parse("11:59"); TimeSpan end = TimeSpan.Parse("13:01");
попробуйте использовать объект TimeRange в C# для достижения своей цели.
TimeRange timeRange = new TimeRange(); timeRange = TimeRange.Parse("13:00-14:00"); bool IsNowInTheRange = timeRange.IsIn(DateTime.Now.TimeOfDay); Console.Write(IsNowInTheRange);
простая маленькая функция расширения для этого:
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; }
The
TimeOfDay
свойства возвращает aTimeSpan
значение.попробуйте следующий код:
TimeSpan time = DateTime.Now.TimeOfDay; if (time > new TimeSpan(11, 59, 00) //Hours, Minutes, Seconds && time < new TimeSpan(13, 01, 00)) { //match found }
и
new DateTime()
это то же самое, чтоDateTime.MinValue
и всегда будет равна1/1/0001 12:00:00 AM
. (Типы значений не могут иметь непустые значения по умолчанию) вы хотите использоватьDateTime.Now
.
вы очень близки, проблема в том, что вы сравниваете DateTime с TimeOfDay. Что вам нужно сделать, это добавить .Свойство TimeOfDay до конца вашего преобразования.Функции ToDateTime ().
используя Linq мы можем упростить это с помощью этого
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))
будет ли это проще для обработки случая границы дня? :)
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 ... }