Я хочу преобразовать форму даты из д / м / г в Y-м-д со смещением часового пояса. Я могу конвертировать из д / м / Y в Y-м-д с помощью этого кода:
$date = DateTime::createFromFormat('d/m/Y', $date);
$date = $date->format('Y-m-d');
Это работает в некоторой степени, но когда я встречаю дату, как это:
echo DateTime::createFromFormat('d/m/Y h:m:s', '19/07/2017 00:00:00');
results is 2016-12-19 00:00:00.000000
echo DateTime::createFromFormat('d/m/Y h:m:s', '20/07/2017 22:51:17');
results is false
РЕДАКТИРОВАНИЕ
Теперь, используя предложенный формат
DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00');
Ожидаемый результат:
06/06/2017 00:00:00 => 2017-06-06 00:00:00.000000
06/06/2017 12:31:34 => 2017-06-06 12:31:34.000000
08/06/2017 21:59:21 => 2017-08-06 21:59:21.000000
19/07/2017 00:00:00 => 2018-07-07 00:00:00.000000 wrong!
20/07/2017 22:51:17 => 2018-08-07 22:51:17.000000 wrong!
21/07/2017 23:39:23 => 2018-09-07 23:39:23.000000 wrong!
27/07/2017 02:46:14 => 2019-03-07 02:46:14.000000 wrong!
использование H
а также i
вместо. Также Вы не можете повторить использование объекта print_r
вместо.
H
для 24-часового формата.
i
за минуты с ведущими нулями
Измените это на:
echo DateTime::createFromFormat('d/m/Y h:m:s', '19/07/2017 00:00:00');
Это:
print_r(DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00'));
Для получения определенного формата
$dateObject=DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00');
echo $dateObject->format("Y-m-d H:i:s");
Пожалуйста, попробуйте это
$date = DateTime::createFromFormat('d/m/Y H:i:s', '20/07/2017 22:51:17');
echo date_format($date, 'Y-m-d H:i:s');
Объяснить Зачем это дает вам такие результаты:
Ваша строка формата даты содержит m
дважды, вторая из которых читает «минуты» часть времени. Это перезаписывает предыдущее, правильное значение месяца. Так как ваша первая строка (19/07/2017 00:00:00
) имеет ноль минут DateTime
объект инициализируется до «0-го» месяца — в PHP это приводит к откату даты на один месяц к предыдущему году, поэтому вы видите декабрь 2016 года.
Ваша вторая строка (20/07/2017 22:51:17
), потому что вы используете h
анализ 24-часового времени — это не удастся при разборе любого числа выше 12.
Как объясняется в других ответах, правильная строка формата для этих дат d/m/Y H:i:s
,