Я пытаюсь проверить дату в input type = "date" в формате d-m-Y. Дата не может быть выше сегодняшней. Я конвертирую разницу в числа, а затем спрашиваю, меньше ли число 0.
Вот моя функция проверки:
public static function validateDate($date){
$dateToday = date_create(date('d-m-Y'));
$datetime = date_create($date);
if (date_diff($dateToday, $datetime)->format('%a') < 0){
return false;
}
else{
return true;
}
}
Функция не работает. пользователь может выбрать любую дату в будущем, и она попадет прямо в БД как ГГГГ-ММ-ДД.
Я довольно потерян здесь, любая помощь будет принята с благодарностью.
Вы можете сравнивать даты с помощью операторов сравнения, таких как < или >. Не нужно делать всю эту ерунду с date_diff.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для начала, это, наверное, плохой ход:
$dateToday = date_create(date('d-m-Y'));
Это плохо, потому что и дата, и месяц состоят из двух цифр. Хотя на самом деле это может дать вам ожидаемый результат, он выглядит нелогичным для американских программистов, потому что здесь даты обычно пишутся m-d-Y. Я бы предложил date("F j, Y"), который является гораздо более четким форматом даты:
var_dump(date("F j, Y")); // outputs "December 8, 2018"
Во-вторых, вы, похоже, не проводите никакой проверки параметра $ date, предоставленного вашей функции. Предположительно, это строка в формате d-m-Y, и вы должны обеспечить это с некоторой проверкой.
Наконец, вы, форматировщик %a, который вы указываете в этой строке, просто предоставляет цифры разницы в датах ... он не указывает, является ли это разницей положительный или разницей отрицательный .:
if (date_diff($dateToday, $datetime)->format('%a') < 0){
//blah blah blah
}
Вам также нужно будет включить флаг формата %R, чтобы получить +/- разницы:
if (date_diff($dateToday, $datetime)->format('%R%a') < 0){
//blah blah blah
}
И, наконец, начиная с PHP 5.2.2., Вы можете просто сравнивать объекты даты, созданные с помощью оператора сравнения. Это лучше, чем ваш код, который сравнивает строку с нулем. Попробуйте эту функцию:
public static function validateDate($date){
if (!preg_match('/^\d{2}-\d{2}-\d{4}$/', $date)) {
throw new Exception("$date is not a valid date in d-m-Y format");
}
$today = date_create(date("Y-m-d"));
$datetime = date_create($date);
if ($datetime > $today) {
return false;
} else {
return true;
}
}
Это действительно мило. Я новичок в Javascript и PHP, но вижу, что в этом гораздо больше смысла, чем в моей функции. Больше устойчивости к регионам.
$today = date_create('midnight') (или аналог new \DateTime('midnight')) - еще один отличный способ сделать это. Кроме того, return $datetime <= $today можно сделать одной строкой, пока вы занимаетесь этим.
Начнем с отладки.