Проверьте, попадает ли экземпляр datetime между двумя другими объектами datetime.

Я хотел бы знать простой алгоритм, чтобы проверить, находится ли данный экземпляр datetime между двумя другими экземплярами в C#.

Примечание.

Я просмотрел это Как сделать Я проверяю, находится ли данный объект даты и времени между двумя датами? и это было для python и многое другое для php. Большинство других вопросов касались различий между ними.

Подробности:

Я более конкретен о времени, дата для меня не имеет значения. Например, я получил запись DataBase для персонала, который работает с 10:00 утра до 9:00 вечера, и я хотел бы знать, какой персонал занят в классе в данное время, например 2:00 Pm. Теперь это вернет мне данные сотрудников, которые заняты в это время.

Изменить

Приняв ответ (прошло более года назад), я понял, что неправильно описал проблему. Но все, что, я думаю, нужно было сделать тогда, это сравнить дату и время. Так что ответы Джейсона и VikciaR работают.


person Deeptechtons    schedule 15.04.2011    source источник
comment
Похоже, вам нужно выполнить сравнение как часть запроса к базе данных, а не в С#.   -  person Andrew Savinykh    schedule 15.04.2011
comment
@Zespri более подробную информацию, чтобы объяснить точную ситуацию. В табеле рабочего времени сотрудника есть время работы сотрудника и время его отсутствия [это служба поддержки клиентов], и у этих людей есть такие поля, как контакт по почте, контакт по телефону, т.е. способы связи. Когда кто-то звонит с проблемой, мне нужно проверить, какая линия связи доступна для сотрудника в данный момент [время, когда клиент звонит в службу поддержки компании], понятно?   -  person Deeptechtons    schedule 15.04.2011
comment
Вы можете использовать столбец базы данных с типом Time и в классе c # TimeSpan. Далее очень просто выберите нужных пользователей: Выберите * из пользователей где workStarts › @now и workEnds ‹ @now;   -  person VikciaR    schedule 15.04.2011


Ответы (5)


DateTime.Ticks будет учитывать время. Используйте .Ticks в DateTime, чтобы преобразовать ваши даты в длинные. Затем просто используйте простую команду if stmt, чтобы увидеть, попадает ли ваша целевая дата между ними.

// Assuming you know d2 > d1
if (targetDt.Ticks > d1.Ticks && targetDt.Ticks < d2.Ticks)
{
    // targetDt is in between d1 and d2
}  
person Jason Slocomb    schedule 15.04.2011
comment
Это правильный ответ? DateTime.Ticks — это количество тактов, представляющих дату и время этого экземпляра. Значение находится между DateTime.MinValue.Ticks и DateTime.MaxValue.Ticks. Таким образом, вы будете сравнивать полную дату, а не время. - person VikciaR; 15.04.2011
comment
-1 Это более непонятный способ получить неправильный ответ — это targetDt < d1, только грязнее. - person Kirk Broadhurst; 11.07.2012
comment
Это будет работать, так как DateTime внутренне простое число. Когда вы анализируете его, он преобразуется в это число. Каждый экземпляр DateTime — это число с разными значениями. Но вы также можете сравнить DateTime, потому что он реализует интерфейс IComparable. Просто удалите все галочки в этом ответе. - person Bitterblue; 27.06.2018
comment
как это было принято как правильный ответ? Выполнение предложенного здесь способа по-прежнему будет учитывать компонент даты объекта DateTime, который не является тем, чего хочет OP. Они хотят просто учитывать компонент времени, а не дату. Получает количество тактов, представляющих дату и время этого экземпляра. документы MS - person Cícero Neves; 15.05.2020

Сделайте простое сравнение > и ‹.

if (dateA>dateB && dateA<dateC)
    //do something

Если вы заботитесь только о времени:

if (dateA.TimeOfDay>dateB.TimeOfDay && dateA.TimeOfDay<dateC.TimeOfDay)
    //do something
person VikciaR    schedule 15.04.2011
comment
@Vikcian не учитывает этот день. пример dt1 = 1/1/2011 1:00:00Am и dt2 = 1/1/2011 5:00:00 Pm и проверенное время 10/2/2011 2:00:00 Am, тогда это вернет false, даже если время 2:00 попадает между 1:00 и 17:00. - person Deeptechtons; 15.04.2011
comment
Из MSDN: свойство DateTime.TimeOfDay — временной интервал, представляющий долю суток, прошедшую с полуночи. Итак, при сравнении двух дат TimeOfDay вы получите то, что хотели - какое время было раньше/позже. - person VikciaR; 15.04.2011
comment
У Вики получилось, это, наверное, самый чистый способ сделать это. - person Matt Greer; 15.04.2011
comment
Работает при условии отсутствия ночных сменщиков. Но если B=23:00 и C=5:00...?? ... не ясен вопрос, могло ли это произойти. - person Ian Mercer; 15.04.2011
comment
Вы правы, Хайтехрайдер. Но это детали - вы можете выразить это с помощью if (B‹C), тогда это не работник ночной смены еще - работник ночной смены. - person VikciaR; 15.04.2011
comment
@Vikcia Отвечает Джейсон, элегантное решение без суеты и дает ответ для всех значений ввода. Но спасибо за хороший старт - person Deeptechtons; 15.04.2011
comment
@Deeptechtons ответ, данный Джейсоном, учитывает компонент даты объекта DateTime. Вы сказали, что вас интересует только временная составляющая. Почему вы решили, что это правильный ответ? Это должно быть правильным, если прочитать вопрос, который вы разместили. - person Cícero Neves; 15.05.2020

Напишите себе вспомогательную функцию:

public static bool IsBewteenTwoDates(this DateTime dt, DateTime start, DateTime end)
{
    return dt >= start && dt <= end;
}

Затем вызовите: .IsBewteenTwoDates(DateTime.Today ,new DateTime(,,));

person Wayne Hamberg    schedule 15.02.2019
comment
Я думаю, должно быть dt › start вместо dt ›= start. - person Valera Scherbakov; 15.07.2020

Вы можете использовать:

if ((DateTime.Compare(dateToCompare, dateIn) == 1) && (DateTime.Compare(dateToCompare, dateOut) == 1)
{
   //do code here
}

or

if ((dateToCompare.CompareTo(dateIn) == 1) && (dateToCompare.CompareTo(dateOut) == 1))
{
   //do code here
}
person KaeL    schedule 15.04.2011
comment
не учитывает ли это даже часть даты. Я меньше всего беспокоюсь о свидании. Время - это все, что имеет для меня значение. Почему я подчеркиваю это, так это то, что во время регистрации сотрудник компании / служба поддержки клиентов просто предоставляет временной интервал, который он может свободно посещать с любыми клиентами. Но дата заполняется фиктивно только потому, что это нужно полю даты и времени в Db. - person Deeptechtons; 15.04.2011

Вы можете использовать:

if (date >= startDate && date<= EndDate) { return true; }
person ynth    schedule 06.09.2019
comment
Это то же самое, что и ответ @VikciaR - person xiawi; 06.09.2019