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

时间:2011-07-06 06:02:40

标签: php datetime

目前我正在使用Doctrine 2和MySQL。当我使用mysql中的datetime字段分别在PHP中使用DateTime时遇到一些问题。在我的数据库中,日期值为“0000-00-00”,在PHP中,此值将转换为-0001-11-30。我很高兴,所以我需要检查日期的“0000-00-00”值。有人对此有所帮助吗?感谢。

N.B。我在想是否应该检查“-0001-11-30”而不是“0000-00-00”。

4 个答案:

答案 0 :(得分:8)

如果未设置日期,请使用NULL表示该状态。这解决了您的问题,使数据库架构更加清晰和冗长。

答案 1 :(得分:5)

另一种方法是在MySQL服务器中设置NO_ZERO_DATE SQL mode。您可以按照http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html

中的说明为当前会话设置它

答案 2 :(得分:0)

我在整个代码中使用此功能。传递类似日期的字符串或DateTime(不可变)对象;它将吐出PHP DateTime或DateTimeImmutable对象,如果输入是" 0000-00-00" -like字符串,则为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)

答案 3 :(得分:-4)

如果您无法在数据库中处理此问题,则可以使用此代码段来避免此行为并验证日期

rt.jar