Я пытаюсь вставить дату и время в поле mysql datetime из строки, имеющей следующий dd / mm / yyyy hh: mm: ss AM / PM format:
20/10/2014 05:39 PM 20/10/2014 05:39 AM
Я знаю, что формат timestamp MYSQL равен yyyy-mm-dd hh: mm: ss или 0000-00-00: 00: 00: 00
Поэтому, если я это сделаю:
$s = substr("20/10/2014 05:39 PM", 0, 10); $h = date("G:i", strtotime($s)); list($day, $month, $year, $hour, $minute) = split('[/ :]', "20/10/2014 05:39 PM"); echo $d1me = $year . '-' . $month. '-' . $day . ' ' . $h;
Я получаю 2014-10-20 19:00
Поэтому я думаю, что существует проблема с функцией date_default_timezone_set (), как решить эту проблему и получить ожидаемый результат?
20/10/2014 05:39 PM -> 2014-10-20 17:39:00 20/10/2014 05:39 AM -> 2014-10-20 05:39:00
Как это сделать?
MySQL уже знает, как обрабатывать много разных типов строк даты изначально, используя STR_TO_DATE()
в сочетании со строками формата, используемыми DATE_FORMAT()
.
Таким образом, я бы вообще не предполагал PHP в этом процессе, а вместо этого позволял MySQL анализировать сам вход.
Строка формата, которую вам нужно использовать, равна %d/%m/%Y %h:%i %p
, где %p
представляет AM/PM
.
Вы можете использовать все выражение прямо в INSERT
, передавая строки непосредственно из PHP, предполагая, что вы уже подтвердили свой формат.
INSERT INTO your_table (timestamp_column) VALUES (STR_TO_DATE('20/10/2014 05:39 PM', '%d/%m/%Y %h:%i %p'));
… будет правильно вставить значение DATETIME
2014-10-20 17:39:00
в ваш стол.
Если вы действительно предпочитаете сначала делать это в PHP, используйте DateTime::createFromFormat()
(PHP 5.3+), используя строку формата 'd/m/YH:i A'
$d = DateTime::createFromFormat('d/m/YH:i A', '20/10/2014 05:39 PM'); var_dump($d); class DateTime#2 (3) { public $date => string(26) "2014-10-20 17:39:00.000000" public $timezone_type => int(3) public $timezone => string(15) "America/Chicago"
Чтобы вернуть дату форматирования MySQL,
echo $d->format('Ymd H:i:s'); // 2014-10-20 17:39:00
Если вы находитесь в крайне неудачной ситуации с версией PHP старше 5.3, вы можете добиться аналогичных результатов с помощью strptime()
но вам нужно собрать его вывод массива в строковый формат MySQL.
Это должно сработать для вас:
<?php $input = "20/10/2014 05:39 AM"; //20/10/2014 05:39 PM list($day, $month, $year, $hour, $minute, $dayType) = preg_split('/[\/\s:]+/', $input); echo $d1me = $year . '-' . $month. '-' . $day . ' ' . ($dayType == "PM"?$hour+12: $hour) . ":" . $minute . ":00"; ?>
в<?php $input = "20/10/2014 05:39 AM"; //20/10/2014 05:39 PM list($day, $month, $year, $hour, $minute, $dayType) = preg_split('/[\/\s:]+/', $input); echo $d1me = $year . '-' . $month. '-' . $day . ' ' . ($dayType == "PM"?$hour+12: $hour) . ":" . $minute . ":00"; ?>
Вывод:
2014-10-20 05:39:00 //2014-10-20 17:39:00
Я думаю, вы можете использовать следующий код. Легче понять:
echo date("Ymd H:i", strtotime("20/10/2014 05:39 PM"));