Я пытаюсь написать правило проверки для месяца кредитной карты, и я использую Уважение Валидация библиотека для этого.
v::string()->date('m')->validate('02');
Результат FALSE
но это должно быть TRUE
потому что «02» является действительным месяцем
РЕДАКТИРОВАТЬ: Хорошо, я нашел проблему. Поскольку в феврале только 28 дней, вы не можете проверить дату с этой библиотекой без дня (сейчас это 30-й день в месяце, поэтому для сравнения он возвращает 03 вместо 02).
Soloution:
v::int()->between(1, 12)->validate(02);
ИЛИ ЖЕ
Вы можете добавить первый день к сравнению.
$value = '01-'.$input;
v::string()->date('d-m')->validate($value);
Вам необходимо указать format
как !m
, Как отмечено в руководстве по PHP, если другие части формата даты не указаны, используется текущее время. С помощью !
сбрасывает время в эпоху UNIX.
Это было объяснено на другой ответ здесь.
PS: мы попробуем исправить это в самой библиотеке.
Проблема заключалась в том, что валидация выполняла эту проверку с использованием DateTime::createFromFormat()
,
Руководство по PHP говорит:
Если
format
не содержит персонажа ! тогда порции сгенерированного времени, которые не указаны в формате, будут установлены на текущее системное время.
Итак, чтобы избежать проблем, исправление было сделано и проверка в настоящее время использует date_parse_from_format()
вместо.
Эта ошибка была исправлена 31 марта 2016 года (версии 0.8.14, 0.9.8 и 1.0.5), и она также доступна в версии 1.1.
Вы можете рассмотреть возможность обновления вашей версии библиотеки.