Преобразование даты в определенном формате в Unix, а затем сравнение - PullRequest
0 голосов
/ 13 мая 2018

У меня проблемы со сравнением двух дат в PHP. Я хочу сравнить текущую дату с датой, введенной пользователем.

$date = "18/05/2018";

Дата, введенная пользователем.

$date_unix = strtotime($date);

Используется для преобразования даты из заданного формата во время для сравнения.

if($date_unix < time()){
        echo '<b>Notice:</b> You cannot specify a date in the past.<br>';
    }

Вышеприведенный оператор if всегда выполняется, и я не понимаю, почему. Любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

strtotime делает предположения о формате даты, и в этом случае эти предположения неверны .

Вы используете формат день / месяц / год (как и я: это формат по умолчанию в Италии). Вчера, дата 12/05/2018 была бы принята strtotime и предполагалась равной 5 декабря 2018 . Тест был бы пройден и, по-видимому, был правильным.

И если бы это была оговорка, то это потребовало бы оплаты за семь месяцев; -D

Поэтому всегда указывайте формат. Для этого я чувствую, что лучше всего использовать DateTime:

 $date = date_create_from_format('d/m/Y', '18/05/2018');

по тем же причинам будьте осторожны при расчете разницы дат .

(Также будьте осторожны с переходом на летнее время).

0 голосов
/ 14 мая 2018

Чтобы решить эту проблему, используя приведенную выше информацию, я использовал explode(), чтобы разделить переменную $date на массив, а затем переставить полученный массив.Затем я собрал воедино разобранные переменные, чтобы сформировать правильный американский формат даты.

Ниже приведен код, относящийся к приведенному выше описанию:

$splitdate = (explode("/",$date));
$splitdate_day = $splitdate[0];
$splitdate_month = $splitdate[1];
$splitdate_year = $splitdate[2];

$date_change = $splitdate_month . "/" . $splitdate_day . "/" . $splitdate_year;

if(strtotime($date_change) < time()){
        echo '<b>Notice:</b> You cannot specify a date in the past.<br>';
    }

Это, возможно, не самый эффективный метод,но это решило проблему, о которой я говорил.

0 голосов
/ 14 мая 2018

следует прекратить использование устаревшего strtotime и начать использовать класс DateTime

$date = "18/05/2018";

$newDate = DateTime::createFromFormat('d/m/Y', $date);

if (new DateTime() < $newDate) {
echo 'future';
}else{
echo 'past';
}
0 голосов
/ 14 мая 2018

Из документации strtotime :

Даты в форматах m / d / y или dmy неоднозначны, если посмотреть на разделитель между различными компонентами: если разделителькосая черта (/), тогда предполагается американский м / д / г

Поскольку 18/05/2018 не является допустимой датой в американском формате (где первое число представляет месяц), ваш strtotime вызов вернет false.И false (ноль) всегда будет меньше, чем time().

Самое простое исправление, если вы уверены в формате ввода, - заменить косую черту тире перед преобразованием в метку времени.Затем strtotime интерпретирует строку как международную дату, которая будет работать правильно:

$date = str_replace('/', '-', "18/05/2018");
$date_unix = strtotime($date);

Однако обновление вашего кода для использования класса DateTime, как в ответах Смита или LSerni, вероятно, даст вам большую гибкость в будущем..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...