2012-06-27 3 views
1

Я делаю фильтр поиска по дате, где у меня есть дата, отображаемая как «j.n.Y G: i (26.6.2012 15:22)». Пользователь может ввести всю дату или только его часть: «26.6», «6.2012», «6», «15:22» - все допустимые значения. Поскольку мне нужно проверить эту дату в базе данных, формат необходимо изменить в одну из базы данных. Для этого я использую:Формат даты и времени из строки ввода

$datum = '25.6.2012'; 
$date = DateTime::createFromFormat('j.n.Y',$datum); 
echo $date->format('Y-m-d H:i'); 

Где я получаю сообщение об ошибке, если $ ИГДЫ не в формате j.n.Y (если я только ввести j.n или один из указанных выше строк частей я получаю сообщение об ошибке).

Проблема также в том, что для введенной строки 'j.n.Y', я получаю правильный вывод даты, который также имеет текущее время, добавленное к строке даты (которая не была в исходной строке даты). Пример: я вводил «22.6.2012», затем получаю вывод «2012-06-22 15:33».

Могут ли эти две проблемы исправляться с существующими функциями php или я должен сделать свой собственный?

Справка была бы принята с благодарностью.

+0

'strtotime' или' strftotime' может немного облегчить задачу. – hjpotter92

ответ

1

Вы можете перечислить свои допустимые форматы данных в массиве, и петля вокруг DateTime::createFromFormat(), чтобы увидеть, если какой-либо из входов получения приемлемого даты:

$formats = array('j.n', 'j.n.Y'); 
$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); 
+0

Благодарим за помощь! – ifsession

0

для первой задачи, вам нужно будет написать некоторый собственный код, потому что некоторые у наши приемлемые входные данные не входят в число признанных форматов ввода. Нормализация входного значения потребует от вас полного анализа (регулярное выражение - это хороший способ запуска), и вы можете без проблем вызвать DateTime::createFromFormat.

Для второй проблемы, поставив восклицательный знак ! в начале строки форматирования, исправит проблему времени. От documentation:

Если формат содержит символ !, то части генерируемого времени, не предусмотренные в формате, а также значения на левой стороне из, будет установлено в соответствующих значений от эпохи Unix.

The Unix epoch is 1970-01-01 00:00:00 UTC.

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

+0

Спасибо за ваш ответ, это тоже помогло! – ifsession

Смежные вопросы