如果我想将结果插入MySQL date()类型列,传递给PHP datetime函数的正确格式是什么?
我一直在尝试date('Y-M-D G:i:s'),但是只插入了“ 0000-00-00 00:00 :00“。

评论

由于您没有提供最新的参数,因此您实际上要记录当前时间吗?

#1 楼

问题是您正在使用'M''D',它们是文本表示形式,MySQL期望使用2010-02-06 19:30:13格式的数字表示形式
尝试:date('Y-m-d H:i:s')使用等效的数字形式。
编辑:将G切换为H,虽然可能不会产生影响,但您可能希望使用前导0的24小时格式。

评论


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

–billynoah
16年6月9日在17:49

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

–马萨特克
16年8月2日在17:17



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

– MRodrigues
16-10-20在13:53

只是想起一个可爱的助记符来记住以下格式:“您的约会对象不是他的约会对象”。在这么多层次上工作:)

–IzzEps
17年1月12日,19:59



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

–billynoah
18年1月1日在18:30

#2 楼

从php的date()手册页的注释中:
<?php $mysqltime = date ('Y-m-d H:i:s', $phptime); ?>

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

评论


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

–蒂姆·莱特尔
2010-2-7在0:42

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

– Pekka
2010-2-7在0:50

#3 楼

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


评论


这是一个优雅的解决方案。谢谢:)

–kta
2014年3月15日13:22



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

–起搏器
15年1月15日在7:57



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

– mopsyd
2015年5月1日19:37



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

–起搏器
2015年5月24日15:38



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

–哼哼
19年6月11日在17:33

#4 楼

我使用以下PHP代码创建一个变量,该变量插入MySQL DATETIME列中。

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


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

#5 楼

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


评论


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

– Toby Speight
16年5月3日12:00

#6 楼

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


评论


我投票支持您的答案,因为在我编辑第一行后它就可以了。函数getDateForDatabase(string $ date):字符串{到函数getDateForDatabase($ date){为什么类型声明会引发错误,我对PHP不够了解。

–克里斯·平克(Chris Pink)
17年7月28日在9:10

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

–克里斯·平克(Chris Pink)
17年7月28日在9:12

#7 楼

将时间戳记格式化为MySQL DATETIME列:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);


#8 楼

使用PHP格式化MySQL日期时间

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


#9 楼

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

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


评论


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

– Shondeslitch
17年3月11日在20:48

#10 楼

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


评论


如果您必须检查是否为空,那么上游数据就很不对劲!

–约翰
20年7月7日在5:59

#11 楼

一个可以接受的答案的小附录:如果将数据库datetime存储为UTC(我总是这样做),则应使用gmdate('Y-m-d H:i:s')而不是date("Y-m-d H:i:s")。或者,如某些答案所示,如果您希望让MySQL处理所有内容,我会插入MySQL的UTC_TIMESTAMP,结果相同。
注意:我理解有关当前时间的问题。

#12 楼

在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');
}


#13 楼

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

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


注意.uP

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