Intereting Posts
Сбалансированный перенос слов (минимальная рвность) в PHP Как я могу запретить пользователям доступ к файлам include? Электронная почта с PHP нарушила кодировку заголовка субъекта Как защитить файлы PHP от загрузки? Найти длину маски совпадения начального сегмента на массивах Должны ли разработчики PHP использовать хранимые процедуры MySQL? PHP DOMDocument: как убедиться, что я получаю 2 элемента, которые являются h3 + таблицей один за другим, а не h3 + p сравнивая массивы в php, не заботясь о порядке C ++ и PHP vs C # и Java – неравные результаты Laravel, как добавить пользовательскую функцию в модель Eloquent? Простой способ проверить, не является ли переменная не равной нескольким строковым значениям? codeigniter Disallowed Key Characters error В чем разница (при применении к моему коду) между INT (10) и INT (12)? Как вы подключаетесь к нескольким базам данных MySQL на одной веб-странице? Использование файла cookie для хранения и получения целого числа

Формат даты и времени из строки ввода

Я делаю фильтр поиска по дате, в котором моя дата отображается как «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.

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