Почему сравнение меньше или больше, чем в PHP, двух строк в формате даты "ГГГГ-ММ-ДД" работает, даже если они являются строками?


Я работаю над разделом PHP-кода для проекта, который сравнивает дату в формате ГГГГ-ММ-ДД с текущей датой, чтобы увидеть, меньше ли она текущей даты. В разных точках кода для этого сравнения использовались два разных метода. Первый использовал get_timestamp() для дат и провел сравнение с отметками времени. В другом месте он просто сравнил строку даты с выводом из date("Y-m-d"). Я ожидал, что сравнение двух строк даты будет не предоставьте правильный ответ. Однако, когда я настроил несколько тестовых случаев, я получил ожидаемый результат. Я просмотрел две части руководства по PHP для понимания, и я все еще не понимаю, почему сравнение работает без преобразования в метку времени.

Раздел операторы сравнения руководства PHP гласит, что строки либо преобразуются в числа, а затем выполняется числовое сравнение, либо выполняется так называемое лексическое сравнение. Я не мог найти что-нибудь еще о лексических сравнениях, но когда я прочитал о преобразовании строк в числа и попробовал примеры с использованием строк даты, я получаю один и тот же числовой вывод для каждой строки даты, которую я пытаюсь.

Может ли кто-нибудь помочь мне понять, почему сравнение двух строк даты больше или меньше работает (или, по крайней мере, кажется, что работает)? Что я упускаю?

В качестве продолжения, если это действительно сработает, я предполагаю, что лучше преобразовать дату в метку времени и сделайте сравнение на основе метки времени. Какую функцию лучше использовать для преобразования даты в метку времени: get_timestamp() или strtotime()?

Пример кода меньше/больше, чем сравнение двух строк ГГГГ-ММ-ДД:

if ("2013-06-27" < "2013-06-28") { echo "less"; } // Output: less
if ("2013-06-27" > "2013-06-28") { echo "more"; } // Output: (none)

if ("2013-06-29" < "2013-06-28") { echo "less"; } // Output: (none)
if ("2013-06-29" > "2013-06-28") { echo "more"; } // Output: more

Пример кода, проверяющий числовое значение преобразованной строки ГГГГ-ММ-ДД

$foo = 1 + "2013-06-27";
echo "\$foo==$foo"; // Output: $foo = 2014
$foo = 1 + "2013-06-28";
echo "\$foo==$foo"; // Output: $foo = 2014
$foo = 1 + "2013-06-29";
echo "\$foo==$foo"; // Output: $foo = 2014
Author: PeterA, 2013-06-28

2 answers

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

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

Также обратите внимание, что это работает только с тех пор, как вы используете формат ГГГГ-ММ-ДД, если бы вы использовали другой формат, это не сработало бы.

 8
Author: Dany Caissy, 2013-06-28 19:06:53

Используйте класс DateTime для сравнения дат. Это значительно облегчает понимание, и вам не нужно иметь дело с жонглированием типами.

 1
Author: Oscar M., 2016-03-02 21:32:49