PHP date()格式插入到MySQL中的datetime

如果我想将结果插入到MySQL的datetime类型列中,在PHP中传递给date()函数的正确格式是什么?

我一直在尝试date('Y-M-D G:i:s'),但那只是插入“0000-00-00 00:00:00"每一次。

829173 次浏览

问题是你使用的是'M''D',它们是文本表示,MySQL期望格式为2010-02-06 19:30:13的数字表示

尝试:date('Y-m-d H:i:s'),它使用数值等价物。

edit:将G切换为H,虽然它可能没有影响,但你可能想使用前导0的24小时格式。

下面是php date()手册页的注释:

<?php $mysqltime = date ('Y-m-d H:i:s', $phptime); ?>

你把“Y”写对了——那是一整年,但是“M”是一个有三个字符的月份,而“M”是一个有两位数字的月份。把D写成D也是一样。“G”是1位或2位小时,其中“H”在需要时总是以0开头。

这里有一个替代的解决方案:如果你在PHP中有日期作为时间戳,绕过PHP处理它,让DB使用FROM_UNIXTIME函数来处理它的转换。

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)


mysql> select * from a_table;


+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+

我使用下面的PHP代码创建一个变量,将其插入到MySQL DATETIME列中。

$datetime = date_create()->format('Y-m-d H:i:s');

这将保存服务器的当前日期和时间。

用PHP格式化MySQL datetime

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

格式化MySQL DATETIME列的时间戳:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
$date_old = '23-5-2016 23:15:23';
//Date for database
$date_for_database = date ('Y-m-d H:i:s'", strtotime($date_old));


//Format should be like 'Y-m-d H:i:s'`enter code here`

如果不使用时间戳,就没有必要使用PHP中的date()方法。如果dateposted是一个datetime列,你可以像这样插入当前日期:

$db->query("INSERT INTO table (dateposted) VALUES (now())");

我使用这个函数(PHP 7)

function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}

PHP的旧版本(PHP <7)

function getDateForDatabase($date) {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}

为了寻找一个简单的答案,我快疯了。最后,我让这个函数似乎捕获所有输入,并给出一个正确或至少有效和可检查的良好SQL字符串。如果是1999-12-31,它可能是错误的,但不会在MySQL中抛出严重错误。

function MakeSQLDate($date) {
if (is_null($date)) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
}


if (($t = strtotime($date)) === false) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
} else {
return date('Y-m-d H:i:s', strtotime($date));
}
}

在PHP7+中使用DateTime类:

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string
{
$dt = new DateTime();
$dt->setDate($year, $month, $day);
$dt->setTime(0, 0, 0, 0); // set time to midnight


return $dt->format('Y-m-d H:i:s');
}

对已接受答案的一个小补充:如果数据库datetime被存储为UTC(我总是这样做),你应该使用gmdate('Y-m-d H:i:s')而不是date("Y-m-d H:i:s")

或者,如果你更喜欢让MySQL处理一切,正如一些答案所建议的,我会插入MySQL的UTC_TIMESTAMP,结果相同。

注:我理解的问题指的是当前时间。

这是一种更准确的方法。它把小数放在秒的后面,以提高精度。

$now = date('Y-m-d\TH:i:s.uP', time());

注意.uP

更多信息:https://stackoverflow.com/a/6153162/8662476

在我的想法中,除了在前面的答案中提供的date()函数选项,你应该仔细考虑它的服务器时区设置的使用可能与数据库的不同。如果需要UTC时区,那么对于特定的情况,gmdate()函数(它具有与date()相同的选项)将更方便。