Как преобразовать строку с датой и временем AM / PM в 24-часовой формат timestamp mysql

Я пытаюсь вставить дату и время в поле 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"));