目前我正在使用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”。
答案 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