PHP что-то не так с моей проверкой даты

Я пытаюсь проверить дату в 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;
    }
}

Функция не работает. пользователь может выбрать любую дату в будущем, и она попадет прямо в БД как ГГГГ-ММ-ДД.

Я довольно потерян здесь, любая помощь будет принята с благодарностью.

Начнем с отладки.

u_mulder 08.12.2018 20:40

Вы можете сравнивать даты с помощью операторов сравнения, таких как < или >. Не нужно делать всю эту ерунду с date_diff.

Jeto 08.12.2018 20:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для начала, это, наверное, плохой ход:

$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, но вижу, что в этом гораздо больше смысла, чем в моей функции. Больше устойчивости к регионам.

Vincent Desrosiers 08.12.2018 21:28
$today = date_create('midnight') (или аналог new \DateTime('midnight')) - еще один отличный способ сделать это. Кроме того, return $datetime <= $today можно сделать одной строкой, пока вы занимаетесь этим.
Jeto 08.12.2018 23:55

Другие вопросы по теме