2013-03-07 5 views
0

фонСпособ расчета DateTime перекресток, где NULL можно

Я интегрируя Limesurvey с приложением, где новые маркеры обследования добавляются непосредственно в базу данных Limesurvey. Прежде чем вставить можно сделать, мне нужно проверить, что данный набор токенов (с атрибутами validfrom и validuntil) в Limesurvey не пересекается с заданным диапазоном дат (DateTime).

Проблема

С Limesurveys лексем validfrom и validuntil атрибуты могут быть NULL, простое сравнение DateTime не может быть сделано, или может?

(A validfrom/validuntilNULL значение Limesurvey означает "всегда")

То, что я

класс PHP, который проверяет, если атрибуты Limesurvey являются NULL (или нет), и возвращение вычислению пересечение по мере необходимости.

Код: http://phpfiddle.org/main/code/3vp-j3b

(Это то, что внутри цикла foreach, линии 34-70, которые интересны здесь)

Что я прошу

Есть ли способ улучшить/оптимизировать этот метод, учитывая, что значения сравнения являются особыми?

+0

Я не понял вопрос : Что и почему именно вы хотите оптимизировать? – BurninLeo

+0

@BurninLeo OK, было недостаточно ясно ... Мне больше всего любопытно, есть ли более плавный способ добиться такого же результата. – Alasjo

+0

Зависит от того, что вы хотите сглаживать. Например, если вы замените «новый DateTime» на не-объектное решение, скрипт становится быстрее, но менее читаемым. – BurninLeo

ответ

1

Вы могли бы заменить нуль с возможной первой и последней датой, чтобы облегчить сравнение:

if (is_null($token['validfrom']) { 
    $token_validfrom = new DateTime('0000-01-01 00:00:00'); 
} else { 
    $token_validfrom = new DateTime($token['validfrom']); 
} 
if (is_null($token['validuntil']) { 
    $token_validuntil = new DateTime('9999-12-31 23:23:59'); 
} else { 
    $token_validuntil = new DateTime($token['validuntil']); 
} 

Таким образом, только ваша последняя строка сравнения должна быть необходимой:

return ($validfrom == $token_validfrom) || ($validfrom > $token_validfrom ? $validfrom < $token_validuntil : $token_validfrom < $validuntil); 
+0

Это на самом деле довольно изящный. В C# есть 'DateTime.MinValue' и' DateTime.MaxValue', но я считаю, что это не так с php. Я думаю, что я поеду с 0001-01-01 для значения «from», так как это используется в C#. http://msdn.microsoft.com/en-us/library/system.datetime.minvalue.aspx – Alasjo