如何在PHP中正确设置"0000-00-00 00:00:00"为DateTime

Rey*_*rPM 2 php datetime symfony doctrine-orm

我有一个列viewedAt是a DATETIME并接受NULL值.在每条新记录上设置该列是一个软件限制,0000-00-00 00:00:00因此我使用Symfony和Doctrine进行简单的操作,如下所示:

$entEmail = new Email();
$entEmail->setViewedAt(new \DateTime('0000-00-00 00:00:00'));
Run Code Online (Sandbox Code Playgroud)

但令人惊讶的是PHP改变了这个日期-0001-11-30 00:00:00,MySQL服务器中的SQL模式设置为STRICT,因此查询失败.我已阅读主题的LOF这里这个,这个和其他一些,但没有回答我的疑问都没有.我已经用PHP做了一些测试,我得到了几乎相同的结果:

$date = new DateTime("0000-00-00 00:00:00", new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d h:i:s');

// outputs
// -0001-11-30 12:00:00
Run Code Online (Sandbox Code Playgroud)

即使设置了MySQL模式,STRICT我也测试了以下查询,它的工作方式如下图所示:

INSERT INTO emails(`emails_category`, `deliveredAt`, `viewedAt`, `data`, `createdAt`, `updatedAt`, `reps_id`, `targets_id`) VALUES ("sent","2015-10-29 06:08:25","0000-00-00 00:00:00",null,"2015-10-29 06:08:25","2015-10-29 06:08:25","005800000058eYcAAI","0018000001GO8omAAD")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,viewedAt在接受0000-00-00 00:00:00该值,即使是无效的(我认为这是一种空左右)

我怎么解决这个问题?有什么工作吗?在这个软件要求无法更改的特定情况下,您对我提出了什么建议?

我正在使用Symfony 2.7.6,Doctrine 2.5.2和PHP 5.5.30

Nie*_*jes 7

你的架构开始是错误的.问题不在于设置日期本身,这显然是无效的,MySQL和PHP都拒绝它,因为没有0年和0月没有0,你看到的输出只是对一种有效的日期(1年1月1日和1月1日之前的1天).但是你也只是错过了如果你做得对,Doctrine摘录它的观点:

$entEmail = new Email();
$entEmail->setViewedAt(null);
Run Code Online (Sandbox Code Playgroud)

现在,Doctrine会愉快地放入NULL数据库列中.

  • 很抱歉这么说,但"MySQL接受它"绝不是一个称为"好"的正当理由.MySQL还接受不完整的`GROUP BY`子句.地狱,MySQL允许您在整数字段中插入字符串,反之亦然.尝试在MSSQL或Oracle中执行上述任一操作,并观察异常情况.你要做的只是完全错误,这就是PHP的`\ DateTime`对象不接受它的原因.并且Doctrine也不必与所有这些DBMS一起工作.MySQL只是因为遗留原因而接受它.您正在编写的代码从根本上被打破并且无法移植.但做我的客人. (3认同)