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

标签 php mysql date datetime

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

20/10/2014 05:39 PM

20/10/2014 05:39 AM

我知道 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() function 本地解析许多不同类型的日期字符串。结合 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'));

...将正确地将 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"

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

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

如果您 非常不幸 的 PHP 版本低于 5.3,您可以使用 strptime() 获得类似的结果。但您需要将其数组输出组装成 MySQL 的字符串格式。

关于php - 如何将带有日期和时间 AM/PM 的字符串转换为 24 小时 mysql 时间戳格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749613/

相关文章:

javascript - 正则表达式可在键入时验证日期mm/dd/yyyy

c - 使用 Zeller 的一致性确定星期几

php - CodeIgniter:格式化 mysql DATETIME 字段 dd/mm/yy hh:mm

php - 我的数据库在 phpMyAdmin 上不可见,但在 mysql 的数据文件夹中可用

mysql - imdbpy2sql 完全运行失败,IMDBPy 为 "except getopt.error"

使用 GROUP BY 时 MySQL SUM 不起作用

php - 将延期交货库存状态添加到 Woocommerce 可变产品下拉列表中

PHP JavaScript MapBox 尝试找出如何传递标记的自定义数据

php - 发布的值显示在 Firebug 中,但在尝试访问它时显示空白数组

c++ - 将 8/17/2003 转换为 boost::gregorian::date