Допустимо ли ко времени в строковом формате применять функцию substr

Данный вопрос по принципам написания чистого кода и немножко по IT-этике. Можно ли для получения строковой даты из строки даты-времени использовать функцию substr?

$a = '2024-03-29 19:46:00';
// На самом деле значение берется из БД, столбца формата даты-времени
// Т.е. в полученной строке $a кроме даты-времени ничего быть не может
$b = substr($a, 0, 10);

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

$b = date('Y-m-d', strtotime($a));
// Аналогично, date, 'Y-m-d' и strtotime заменяют функции и константы для работы с временем из проекта

Насколько данное замечание является справедливым, и если да, то в каких рекомендациях регламентирован данный и другие подобные принципы кода?


Ответы (1 шт):

Автор решения: Andre Polykanine

Замечание крайне справедливо. Во-первых, как уже указали в комментариях, формат даты в БД может измениться: кто-то возьмёт и скажет, что лучше хранить даты как timestamps — целые числа секунд с начала эпохи Unix. И всё, ваш метод не сработает.
Но даже если не брать это в расчёт, сама строчка

$b = substr($a, 0, 10);

вообще не отражает смысла написанного кода. Что за подстрока, почему до десятого символа? Нужно писать обширный комментарий, заменять «магическое число» 10 на константу где-нибудь вверху класса, и т.д., и т.п.
А ещё есть такая штука, как type safety, безопасность типов. Современный PHP позволяет вполне неплохо работать с типами. Я не знаю, что вы собираетесь делать с этой датой потом, но есть вероятность, что вам будет полезнее взять дату для строки с помощью DateTime::format(), а сам объект продолжать хранить в переменной.

Ещё одна вещь, которую можно сделать, это использовать MySQL-функцию DATE, если вы используете эту базу данных:

SELECT `id, `something_else`, DATE(`my_date_time`) FROM `table` WHERE [...]
→ Ссылка