如何将带有日期和时间AM/PM的字符串转换为24小时的mysql时间戳格式

cMi*_*nor 4 php mysql datetime date

我试图从具有以下dd/mm/yyyy hh:mm:ss AM/PM格式的字符串中将日期和时间插入到mysql datetime字段中:

20/10/2014 05:39 PM

20/10/2014 05:39 AM
Run Code Online (Sandbox Code Playgroud)

我知道MYSQL时间戳格式是yyyy-mm-dd hh:mm:ss or 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;
Run Code Online (Sandbox Code Playgroud)

我明白了 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
Run Code Online (Sandbox Code Playgroud)

怎么做?

Mic*_*ski 11

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'));
Run Code Online (Sandbox Code Playgroud)

...将正确地将DATETIME2014-10-20 17:39:00插入表中.

如果您真的更喜欢在PHP中使用它,请使用DateTime::createFromFormat()格式字符串(PHP 5.3+)'d/m/Y H:i A'

$d = DateTime::createFromFormat('d/m/Y H: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"
Run Code Online (Sandbox Code Playgroud)

要从中获取MySQL格式的日期,

echo $d->format('Y-m-d H:i:s');
// 2014-10-20 17:39:00
Run Code Online (Sandbox Code Playgroud)

如果您处于使用早于5.3的PHP版本的非常不幸的情况下,您可以获得类似的结果,strptime()但您需要将其数组输出汇编为MySQL的字符串格式.