PHP Дата strtotime - PullRequest
       1

PHP Дата strtotime

1 голос
/ 26 марта 2020

У меня проблема с форматированием даты и добавлением дней. У меня есть функция, подобная этой:

public function test($date)
{
    var_dump($date);
    var_dump(date("d/m/Y", strtotime($date . '+ 1 days' )))

}

для этого примера, если я использую «02/09/2019» в качестве даты, которую я получаю:

02/09/2019
10/02/2019

Я ожидаю

02/09/2019
03/09/2019

Может кто-нибудь помочь мне найти решение этой проблемы? Спасибо

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Основная проблема здесь в том, что 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

0 голосов
/ 27 марта 2020

Вы пытались использовать Carbon a php библиотека времени и даты . это делает работу с датами очень простой, очень легко форматировать даты и добавлять даты с помощью этой библиотеки. Здесь - краткое руководство

$dt = Carbon::create(2019, 09, 02, 0);
echo $dt->addDays(1);
0 голосов
/ 27 марта 2020

Обычно 09 считается днем, поэтому к нему добавляется +1, поэтому выходное значение равно 10/02/2019. Предоставленное решение может быть не идеальным, но оно должно соответствовать вашим целям.

echo date("d/m/Y", strtotime(str_replace('/','-','02/09/2019') . '+1 days'));

который даст 03.09.09 2019

...