Основная проблема здесь в том, что PHP интерпретирует $date
как дату, которую вы намеревались представить. Это потому, что вы используете неоднозначный формат для даты. В зависимости от ваших культурных норм, 02/09/2019
может означать 2nd September
(d/m/Y
формат - обычно используется в Европе и других местах) или 9th February
(m/d/Y
формат - обычно используется в Северной Америке и других местах).
PHP обрабатывает вашу строку как формат m/d/Y
и добавляет к ней один день - следовательно, в результате вы получите 10th February
.
Однако это не должно слишком много сюрпризов. То, что он будет делать с вашей строкой , является документированным и предсказуемым. В руководстве strtotime в примечаниях говорится:
Даты в форматах m / d / y или dmy устраняются неоднозначно, если смотреть на разделитель между различными компонентами: если разделитель является sla sh (/), то предполагается, что американский m / d / y; тогда как если в качестве разделителя используется da sh (-) или точка (.), то подразумевается европейский формат dmy. Однако, если год указан в формате двух ди git, а разделитель - да sh (-), строка даты анализируется как ymd.
Чтобы избежать потенциальной неоднозначности, лучше всего использовать даты ISO 8601 (ГГГГ-ММ-ДД) или DateTime :: createFromFormat (), когда это возможно.
Существует два основных способа решения этой проблемы: продемонстрировано в функциях «test» и «test2» в приведенном ниже примере кода.
Первый подход в функции «test» сохраняет ваш существующий код таким же, но вводит дату в универсальный Y-m-d
формат, так что нет никакой путаницы в том, какая часть является днем, а какой месяцем.
Если по какой-то причине это не работает для вас, тогда второй подход изменяет код для использования DateTime :: createFromFormat функция, которая будет анализировать дату в соответствии с форматной строкой, которую вы ей передаете, и создавать объект DateTime
, который затем можно будет манипулировать, а также повторно форматировать (в любой формат строки, который вы выберете), когда вы готов к выводу.
<?php
function test($date)
{
var_dump($date);
var_dump(date("d/m/Y", strtotime($date . '+ 1 days' )));
}
function test2($date)
{
var_dump($date);
$dt2 = DateTime::createFromFormat("d/m/Y", $date);
$dt2->add(new DateInterval('P1D'));
var_dump($dt2->format("d/m/Y"));
}
test("2019-09-02");
test2("02/09/2019");
вывод "test":
"2019-09-02"
"03/09/2019"
вывод "test2":
"02/09/2019"
"03/09/2019"
Демонстрация: http://sandbox.onlinephpfunctions.com/code/71e07798a109859cabd242d77acb1eafaef5bfe8