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

时间:2015-10-29 21:55:43

标签: php symfony datetime doctrine-orm

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

$entEmail = new Email();
$entEmail->setViewedAt(new \DateTime('0000-00-00 00:00:00'));

但令人惊讶的是PHP将该日期更改为此-0001-11-30 00:00:00并且MySQL服务器中的SQL模式设置为STRICT,因此查询失败。我在这里阅读了一些主题thisthis以及其他一些主题,但根本没有回答我的疑问。我仅用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

即使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")

enter image description here

所以viewedAt即使无效也接受0000-00-00 00:00:00该值(我认为它的类型为NULL左右)

我如何解决这个问题?有什么工作吗?在这个特定情况下,您对我的建议是什么?这是一个软件要求而且无法更改?

我使用的是Symfony 2.7.6,Doctrine 2.5.2和PHP 5.5.30

3 个答案:

答案 0 :(得分:7)

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

$entEmail = new Email();
$entEmail->setViewedAt(null);

Doctrine现在很乐意将NULL放在数据库列中。

答案 1 :(得分:0)

$Date = date('Y-m-d H:i:s');

有时候使用老式的方式更容易吗?

答案 2 :(得分:0)

这取决于您的数据库字段。在MySQL中,TIMESTAMP字段是1970年后的。 如果要使其可为空,则应使字段允许为null。即使您使用DATE字段,也应该发布1000AD。

如果您打算使用实时时间戳,可以使用以下内容:

date_default_timezone_set('America/New_York');
$date = date('Y-m-d H:i:s');

$entEmail = new Email();
$entEmail->setViewedAt( $date );

或(如果你想要更简洁)

date_default_timezone_set('America/New_York');

$entEmail = new Email();
$entEmail->setViewedAt( date('Y-m-d H:i:s') );