Почему DateTime :: createFromFormat ('d-m-Y H: i A', $ date) -> format ('d-m-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
13:00 должен быть 13:00, в настоящее время я работаю над тестированием A, чтобы увидеть, имеет ли это значение, а также изменение вокруг H
@TomCurphey Вы нашли подходящее решение в любом из этих # ответов? Если нет, расскажите подробнее. В противном случае сделайте и примите решение, которое лучше всего для вас, чтобы закрыть вопрос - см. Что мне делать, если кто-то ответит на мой вопрос?






Вы не можете иметь 13:00 вечера Если вы делаете форматирование, функция думает, что это на следующий день.
Измените код на решение ниже:
** Примечание: $ date_input и $ another_date относительно их формата 'H или 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/>';
«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
(
)
)
Кажется, что реализация трактует 13:00 как 1:00, как и «31 ноября» как 1 декабря.
Согласно PHP-документация DateTime :: __ construct ()
Non-existent values roll over.
// Non-existent values roll over.
$date = new DateTime('2000-02-30');
echo $date->format('Y-m-d H:i:sP') . "\n";
вывод
2000-03-01 00:00:00-05:00
Так что это не ошибка, это особенность.
В 12-часовом формате часы идут с 1 до 12. Нет «13 часов вечера», но если бы они были, что бы это было, если не 1 утра следующего дня?