VICK Ответов: 3

Сделать перекрытие диапазона времени в LINQ в C#


Я провел несколько тестов перекрывающихся диапазонов и успешно завершил сценарий перекрывающихся диапазонов дат, но, с другой стороны, я должен проверить перекрывающиеся диапазоны времени, и я не могу этого сделать. У меня есть сценарий, как показано ниже,

У меня есть целый ряд 8am to 5pm и второй диапазон 8 pm to 9am

Я пробовал как 3

bool overlap = a.start < b.end && b.start < a.end;


И ожидаемые результаты верны, поскольку 8 утра перекрываются в диапазоне от 8 вечера до 9 утра, но из-за связанной с датой части это вызывает проблемы.


Есть какие-нибудь идеи или руководство, чтобы решить эту проблему?

Что я уже пробовал:

bool overlap = a.start < b.end && b.start < a.end;

3 Ответов

Рейтинг:
2

#realJSOP

Попробовать это:

bool overlap = a.start.TimeOfDay < b.end.TimeOfDay && b.start.TimeOfDay < a.end.TimeOfDay;


VICK

Разнесенное решение работает только тогда, когда временной диапазон также включает в себя часть даты. Или диапазон линейный, то есть не перекрестный день.

Рейтинг:
1

VICK

Предположим, у нас есть диапазон дат a какое время начала и окончания указано ниже

a.start = '1900-01-01 08:00:00.000'; i.e 8am
a.end = '1900-01-01 17:00:00.000'; i.e. 5pm



и мы хотим проверить, совпадает ли он с существующими диапазонами или нет.
предположим, что один из предыдущих диапазонов b которые имеют время начала и окончания, как показано ниже,

b.start = '1900-01-01 23:00:00.000'; i.e 11pm
b.end = '1900-01-01 09:00:00.000'; i.e. 9am


таким образом, b имеет период перекрытия с 8 утра до 9 утра с a, так как временные интервалы являются перекрестными днями, поэтому я нахожу перекрытие, как показано ниже.

bool isOverLapping = false;
a = FirstRange;

double basehours = (a.end - a.start).TotalHours;

if (basehours <= 0)
{
    basehours = basehours + 24;
}


foreach(var b in previousRanges)
{
 	double alpha1 = (b.start - a.start).TotalHours;

	if (alpha1 <= 0)
	{
	  alpha1 = alpha1 + 24;
	}

	double alpha2 = (b.end - a.start).TotalHours;

	if (alpha2 <= 0)
	{
	  alpha2 = alpha2 + 24;
	}

	if (basehours <= alpha1 && basehours <= alpha2)
	{
	  isOverLapping = false;
	}
	else
	{
	  isOverLapping = true;	
	}
}



Я надеюсь, что это поможет кому-то, кто сталкивается с этой проблемой так же, как и я.


phil.o

Однажды мне пришлось все это устроить, боюсь, что на этот вопрос можно ответить очень быстро. Я помню, что создал Range структура, и что есть несколько способов, которыми два диапазона могут перекрываться или нет. Итак, AreOverlapping результат будет использовать комбинацию нескольких из этих способов.
Я тоже это помню
Яни Giannoudis
[^]'статьи Библиотека временных периодов для .NET[^ это очень помогло мне понять и смоделировать процесс.
К сожалению, у меня больше нет этого кода. Это было для версии MSCRM, с которой я был так счастлив перестать работать.

VICK

На самом деле я не получил никакого метода от TimePeriodLibrary относительно проблемы TimeRange без сравнения частей даты. Или же я не мог понять его в глубине.
Было бы очень приятно, если бы вы могли сделать фрагмент кода, используя эту библиотеку в соответствии с моим вышеупомянутым сценарием?

phil.o

Как я уже говорил вам, то, что мне пришлось настроить, не было решением "быстрого фрагмента", и я боюсь, что это не подойдет для форума быстрых ответов. Вы не можете двигаться вперед, если считаете, что вам не нужно сравнивать с частью даты. Часть даты так же важна, как и часть времени, если периоды, которые вы хотите сравнить, перекрываются на одной или нескольких дневных границах.

Рейтинг:
0

johannesnestler

Я предполагаю, что начало и конец-это DateTime/DateTimeOffset экземпляры.
Используйте a.start.TimeOfDay свойство от ваших дат, чтобы получить TimeSpan от дат (игнорировать часть даты в вычислении)

подобный этому:

bool overlap = a.start.TimeOfDay < b.end.TimeOfDay  && b.start.TimeOfDay  < a.end.TimeOfDay;


или просто храните время в первую очередь, например, вот так, тогда ваше сравнение также будет работать

DateTime myTime = default(DateTime).Add(myDateTime.TimeOfDay);


VICK

Разнесенное решение работает только тогда, когда временной диапазон также включает в себя часть даты. Или диапазон линейный, то есть не перекрестный день.

johannesnestler

Я не понимаю, что ты пытаешься сказать... мы сравниваем время только здесь - то, что вы имеете в виду под "частью даты". Вы спросили, Как проверить совпадения во времени...

VICK

Пожалуйста, взгляните на мое опубликованное решение, в котором я попытался объяснить точную проблему, с которой столкнулся, и решение, которое я принял.