Почему DateTime :: createFromFormat ('dmY H: i A', $ date) -> format ('dm-Y') меняет дату на следующий день после 13:00? - PullRequest
0 голосов
/ 04 декабря 2018

Почему DateTime :: createFromFormat ('dmY H: i A', $ date) -> format ('dm-Y') меняет дату на следующий день после 13:00?

** ПримечаниеЯ думаю, что это как-то связано с форматом 'H' или 'h'. Я все еще пытаюсь понять это ..

    $date = "04-12-2018 12:59 PM";
    $date_input = "04-12-2018 13:00 PM";

    echo $date . ' - date <br>';
    echo $date_input . ' - date_input <br>';

    var_dump($date);
    echo '<br/>';
    var_dump($date_input);
    echo '<br/>';

    echo DateTime::createFromFormat('d-m-Y H:i A', $date)->format('d-m-Y') . '<br/>';
    echo DateTime::createFromFormat('d-m-Y H:i A', $date_input)->format('d-m-Y') . '<br/>';

Результаты:

04-12-2018 12:59 PM - date

04-12-2018 13:00 PM - date_input 

string(19) "04-12-2018 12:59 PM" 

string(19) "04-12-2018 13:00 PM" 

04-12-2018

05-12-2018

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

«13:00 pm» не является действительным временем: в 12-часовых часах часы переходят с 1 на 12. Вы можете проверить, не удалось ли выполнить синтаксический анализ, позвонив по номеру DateTime::getLastErrors():

php > echo DateTime::createFromFormat('d-m-Y H:i A', $date_input)->format('d-m-Y');
05-12-2018
php > print_r(DateTime::getLastErrors());
Array
(
    [warning_count] => 1
    [warnings] => Array
        (
            [19] => The parsed time was invalid
        )

    [error_count] => 0
    [errors] => Array
        (
        )

)

Itкажется, что реализация рассматривает 13:00 как 1:00, точно так же, как это обрабатывает "31 ноября" как 1 декабря.

0 голосов
/ 04 декабря 2018

В соответствии с PHP документацией DateTime :: __ construct ()

Перевернутые несуществующие значения.

// Non-existent values roll over.
$date = new DateTime('2000-02-30');
echo $date->format('Y-m-d H:i:sP') . "\n";

output

 2000-03-01 00:00:00-05:00

Так что это не ошибка, это особенность.

0 голосов
/ 04 декабря 2018

У вас не может быть 13:00 вечера. Если вы выполняете функцию форматирования, которая думает, что это следующий день.

Измените код на приведенное ниже решение:

** Примечание: $ date_input& $ another_date относительно их формата 'H or h' & 'A'

$date = "04-12-2018 12:59 PM";
$date_input = "04-12-2018 13:00";
$another_date = "04-12-2018 01:00 PM" ;

echo $date . ' - date <br>';
echo $date_input . ' - date_input <br>';
echo $another_date . ' - another_date <br>';

var_dump($date);
echo '<br/>';
var_dump($date_input);
echo '<br/>';
var_dump($another_date);
echo '<br/>';

echo DateTime::createFromFormat('d-m-Y H:i A', $date)->format('d-m-Y') . '<br/>';
echo DateTime::createFromFormat('d-m-Y H:i', $date_input)->format('d-m-Y') . '<br/>';
echo DateTime::createFromFormat('d-m-Y h:i A', $another_date)->format('d-m-Y') . '<br/>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...