如何防止PHP将值为0000-00-00的DateTime对象转换为-0001-11-30



目前我正在使用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
}

相关内容

  • 没有找到相关文章

最新更新