目前我正在使用Doctrine 2和MySQL。当我分别在mysql和PHP中使用datetime中的datetime字段时,我遇到了一些问题。当在我的数据库中,日期值为"0000-00-00"时,在PHP中,该值被转换为-0001-11-30。我对此感到高兴,所以我需要检查日期的"0000-00-00"值。有人对此有什么想法吗?谢谢
注意:我在想,用"-0001-11-30"代替"0000-00-00"是否正确。
如果未设置日期,请使用NULL
来指示该状态。这解决了您的问题,并使数据库模式更加清晰和详细。
另一种选择是在MySQL服务器中设置NO_ZERO_DATE
SQL模式。您可以为当前会话设置它,如中所述http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
我在整个代码中都使用这个函数。给它传递一个类似日期的字符串或DateTime(不可变(对象;它将吐出一个PHP DateTime或DateTimeImmutable对象,如果输入是类似"0000-00-00"的字符串,则为false。使用第二个参数,它也可以强制结果不可变:
function ensureDateTime ( $input, $immutable = NULL ) {
if ( ! $input instanceof DateTimeInterface ) {
if ( in_array( $input, ['0000-00-00', '0000-00-00 00:00:00'], true ) ) {
$input = false;
} elseif ( $immutable ) {
$input = new DateTimeImmutable( $input );
} else {
$input = new DateTime( $input );
}
} elseif ( true === $immutable && $input instanceof DateTime ) {
$input = new DateTimeImmutable( $input->format(TIMESTAMPFORMAT), $input->getTimezone() );
} elseif ( false === $immutable && $input instanceof DateTimeImmutable ) {
$input = new DateTime( $input->format(TIMESTAMPFORMAT), $input->getTimezone() );
}
return $input;
}
基本上是一个"我不确定我从什么开始,但我知道我想要什么"的函数。
(注意:这里有一点PHP 7语法,但很容易适应PHP 5(
如果你不能在数据库中处理这个问题,你可以使用这个片段来避免这种行为并验证日期
$date = new DateTime('0000-00-00 00:00');
if (DateTime::createFromFormat('Y-m-d', $date->format('Y-m-d'))) {
// Valid
} else {
// Not valid
}