Как создать валидатор даты и времени в форме Zend Framework?

По умолчанию средство проверки даты Zend Framework использует формат даты yyyy-MM-dd:

$dateValidator = new Zend_Validate_Date();

Но я хочу добавить часовую и минутную проверку. Другими словами, я хочу, чтобы пользователь вводил час и минуту. Но следующее не работает:

$dateValidator = new Zend_Validate_Date('yyyy-MM-dd hh:ii');

Если я введу 2010-02-01, я получаю сообщение о том, что дата не соответствует формату. Если я введу 2010-02-01 3, он не будет жаловаться. Он делает предположение, что пользователь означает 2010-02-01 03:00 вместо того, чтобы принуждать пользователя вводить дату в данном формате.

Как я могу гарантировать, что дата должна быть введена в данном формате?

3 ответа

Смотрите: http://framework.zend.com/issues/browse/ZF-6369

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

Похоже, что ошибка отмечена как "Major", поэтому, надеюсь, скоро увидим исправление.


Чтобы добавить к ответам Ноя, Zend_Validate_Date действительно ужасно и негибко; то есть, если вы хотите иметь более прощающую политику для ввода даты.

Теперь, если ZF отправлен с Zend_Filter_Date, который нормализует различные тривиальные (хотя и очень синтаксические) форматы выбора даты/входные данные пользователя, это может быть другая история, поскольку вы можете отфильтровать дату в нормализованном формате, затем подтвердите, что он находится в этом формате. Но это не так.

Несмотря на это, есть много разумных решений этой проблемы. Вероятно, самый простой из них:

$validator = new \Zend_Validate_Callback(function($value) {
 return (bool)strtotime($value);
});

Лично мне не важно, входит ли дата/дата в yyyy/MM/dd, 23 сентября 2012 года или как "-2 недели" - все, что мне действительно волнует, - это умение strtotime достаточно, чтобы разобрать его.


+1 Стивену ответ. Я пошел на аналогичное решение, так как я уже знал формат, который я должен был проверить:

$validator = new \Zend_Validate_Callback(function($value) {
 return (bool) date_create_from_format('Y-m-d H:i', $value);
});

licensed under cc by-sa 3.0 with attribution.