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


324

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

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


3
由于您没有提供最新的参数,您实际上要记录当前时间吗?
Mark Elliot'2

Answers:


680

问题是您正在使用'M''D',它们是文本表示形式,MySQL希望使用格式的数字表示形式2010-02-06 19:30:13

尝试:date("Y-m-d H:i:s")使用数字等效项。

编辑:切换GH,虽然可能没有影响,但您可能希望使用带前导0的24小时格式。


28
这必须是任何人都需要的最常见的单一日期时间格式之一。应该是内置的php全局或日期函数本身的一部分(例如'c','r')
billynoah

33
我不知道为什么不是这种情况。我必须参考每个堆栈溢出。单。运作。时间。
Mazatec '16

11
比在我的代码中搜索这种用法要快得多。
MRodrigues

64
只是想到了一个可爱的记忆对记忆的格式为:“ Ÿ我们的 Ÿ d吃了没有 ”。可以在这么多级别上使用:)
IzzEps

2
应该有一个php的简写,因为ISO 8601和RFC 2822
Billynoah

105

从PHP的date()手册页的评论:

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

您输入了正确的“ Y”,即整整一年,但是“ M”是一个三个字符的月,而“ m”是一个两位数的月。与“ D”而不是“ d”相同的问题。“ G”是1或2位数的小时,其中“ H”在需要时始终以0开头。


1
谢谢@Pekka-我记得您和我的代表大致相同时-您一直都很活跃。
Tim Lytle

1
是的,我现在工作很忙,所以这是我之间最喜欢的消遣:),这会再次发生变化。
Pekka '02

41

这是一个替代解决方案:如果您将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 |
+---------------------+

谢谢

2
@trejder,谁告诉您在mysql中执行此操作比在php中执行操作快?用PHP进行操作会更好,因为数据库通常是瓶颈,并且您希望尽快进入和退出
Pacerier

1
@Pacerier如果您的数据库构建不佳,或者运行太多的小型查询而不是更有效的有效单个查询,或者在很多情况下依靠ORM来管理数据库,则DB是瓶颈。具有良好索引的关系数据库的稳定SQL并不慢。
mopsyd 2015年

2
@ mopsyd,DB是瓶颈,因为水平扩展它需要复杂性。将其与无需更改任何代码即可在全球范围内复制的Web服务器相比较。
Pacerier

1
如果查询失败,将其记录在某个地方,并且您必须对其进行调试,则时间戳比@ tim-lytle描述的格式化日期字符串难读得多。
humbads

27

我使用以下PHP代码创建一个变量,然后将其插入MySQL DATETIME列。

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

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


12
$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`

2
尽管此代码可以回答问题,但是提供有关其为什么和/或如何回答问题的其他上下文将显着提高其长期价值。请编辑您的答案以添加一些说明,并解决格式问题。
Toby Speight


8

使用PHP格式化MySQL日期时间

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

8

我使用此功能(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;
}

我投票支持你的答案,因为在我编辑第一行后它就可以了。function getDateForDatabase(string $date) : string {function getDateForDatabase($date) {为什么类型声明抛出一个错误,我不知道足够的PHP告诉。
克里斯·平克

“传递给getDateForDatabase()的参数1必须是字符串的实例,给定的字符串,”-我的输入是字符串,
克里斯·平克

7

如果您不使用时间戳,则无需使用PHP中的date()方法。如果dateposted是datetime列,则可以这样插入当前日期:

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

2
感谢您分享这种方法。到目前为止,这是我见过的最简单的方法。
Shondeslitch

2

这一直让我发疯寻找简单的答案。最后,我做了一个似乎可以捕获所有输入并给出正确或至少有效且可检查的良好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));
    }
}

1

DateTime在PHP7 +中使用类:

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

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

1

可以接受的答案的小附录:如果数据库datetime存储为UTC(我经常这样做),则应使用gmdate("Y-m-d H:i:s")代替date("Y-m-d H:i:s")

或者,如果您希望让MySQL处理所有事情,如一些答案所示,我将插入MySQL的UTC_TIMESTAMP,结果相同。

注意:我了解有关当前时间的问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.