Я делаю фильтр поиска по дате, в котором моя дата отображается как «jnY G: i (26.6.2012 15:22)». Пользователь может ввести целую дату или только ее часть: «26.6», «6.2012», «6», «15:22» – все допустимые значения. Поскольку мне нужно проверить эту дату в базе данных, формат необходимо изменить в одну из базы данных. Для этого я использую:
$datum = '25.6.2012'; $date = DateTime::createFromFormat('jnY',$datum); echo $date->format('Ymd H:i');
Где я получаю сообщение об ошибке, если $ datum не находится в формате jnY (если я вхожу только в jn или одну из вышеупомянутых строк, я получаю сообщение об ошибке).
Проблема также в том, что для введенной строки «jnY» я получаю правильный вывод даты, которая также имеет текущее время, добавленное к строке даты (которая не была в исходной строке даты). Пример: я вводил «22.6.2012», затем получаю вывод «2012-06-22 15:33».
Могут ли эти две проблемы быть исправлены с существующими функциями php или я должен сделать свой собственный?
Помощь будет принята с благодарностью.
Вы можете перечислить ваши приемлемые форматы данных в массиве и создать цикл вокруг DateTime::createFromFormat()
чтобы узнать, соответствует ли какой-либо из входов приемлемая дата:
$formats = array( 'j.n', 'jnY'); $datum = '25.6.2012'; $date = false; foreach( $formats as $format) { $date = DateTime::createFromFormat( $format, $datum); if( !($date === false)) break; } if( $date === false) { echo "Invalid date!\n"; }
Наконец, если вы хотите избавиться от текущего времени во вновь созданном объекте и установить время до 00:00:00
, просто используйте метод setTime()
для объекта даты:
// Sets the time to O hours, 0 minutes, 0 seconds $date->setTime( 0, 0, 0);
Для первой проблемы вам нужно будет написать собственный код, потому что некоторые из ваших приемлемых входов не относятся к распознанным форматам ввода. Нормализация входного значения потребует от вас полного анализа (регулярное выражение – это хороший способ запуска), и вы можете без проблем вызвать DateTime::createFromFormat
.
Для второй проблемы, поставив восклицательный знак !
в начале строки формата будет исправлена проблема времени. Из документации :
Если формат содержит символ
!
, то части сгенерированного времени, не предоставленные в формате, а также значения в левой части символа!, будут установлены в соответствующие значения из эпохи Unix.Эпоха Unix – это 1970-01-01 00:00:00 UTC.
Однако, поскольку вам нужно полностью проанализировать ввод, как указано выше, вопрос спорный. Также обратите внимание, что восклицательный знак приведет к отсутствию значений года, месяца и дня для использования значений по умолчанию, которые, вероятно, нежелательны.