寻找速记或更好的方法来测试零日期(MySQL 日期时间列),除了:
if ($row['this_date'] == '0000-00-00 00:00:00') echo 'No date set.';
有测试它的 PHP 函数吗?谢谢。
我认为你不需要任何速记。
这是某种微观优化。
你已经花在问这个问题上的时间比一年平均编码中节省的时间还要多了。写下来然后继续。
难道你还有更重要的问题要解决吗?
此外,使用这样的简写,您将混淆您自己的代码。
您当前的陈述非常清楚,如下所示:
"if date is empty"
你真正想要的是可读性。但你已经拥有了。虽然所有建议的简写都不是。
关于:
if(strtotime($row['this_date']) == 0) echo 'No date set.';
虽然您可能应该在数据库中使用 NULL,但一个简单的技巧是:
if(!(int)$row['this_date'])echo'No Date Set.';
您期望找到什么样的更好的方法?它本来就快。
附注这是一个黑客,因为我假设你已经设定了一年。这意味着它不适用于字符串
0000-00-00 00:00:01
作为正则表达式的粉丝,我将添加另一个:
if (!preg_match('/[1-9]/', $row['this_date'])) echo 'No date set.';
if (strtotime($row['this_date'])) echo 'No date set.';
我正在使用:
if ($timedate->format('U') == -62169962400){
// 0000-00-00
}
format('U')
将返回 Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
该数字可能需要根据时区进行调整
使用检查日期
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
上面的例子将输出:
bool(true)
bool(false)
这是我用于完全相同的事情的函数:
/**
* Like empty(), but also returns true for empty MySQL DATE ('0000-00-00') and DATETIME ('0000-00-00 00:00:00')
*
* @param mixed $var Variable to check
* @return bool
*/
function empty_date($var)
{
if (empty($var) or $var === '0000-00-00' or $var === '0000-00-00 00:00:00')
return true;
else
return false;
}
您可以使用以下代码
$date = '0000-00-00 00:00:00';
if(str_replace(array("-", " ", ":"), "", $date)*1>0){
echo "DATE";
} else {
echo "NODATE";
}
应不惜一切代价避免使用和存储零日期。此函数可以帮助缩小差距,直到它们从代码中完全删除。也许它可以被称为“isEmptyDate”或“isNullDate”。
// Returns 'true' for zero, zero dates or times, null, false
function isZeroDate($date)
{
if (empty($date)) return true;
if (is_string($date)) {
// Extract any character that it's not digit and convert it to int
// 0000-00-00 00:00 || 0000 || 00:00 || 0000-00-00 will return true
$ival = intval(preg_replace('~\D~', '', $date), 10);
if ($ival == 0) return true;
}
return false;
}
Carbon 和 DateTime 类无法解析这种格式“0000-00-00 00:00:00”的零日期。
使用 Laravel 等任何 PHP 框架,在迁移中使用可空列在数据库中存储 NULL 日期
例如。在 Laravel 中:
$table->timestamp('some_date')->nullable()->default(null);
例如在 MySql 中:
create table date_test (some_date datetime null default null);
insert into date_test (some_date) values (null);
我目前使用并正在探索的东西,希望找到更好的解决方案......
function prep_empty_fields(&$data) {
$is_obj = is_object($data);
$is_arr = is_array($data);
if ($is_obj || $is_arr) {
$empty_values = array(
NULL,
FALSE,
'0',
'00',
'0000', //year
'000000',
'00000000',
'0000000000',
'000000000000',
'00000000000000',
'0000000000000000',
'0000-00-00 00:00:00', //datetime
'0000-00-00', //date
'00:00:00', //time
'0.0000',
'0.000',
'0.00',
'0.0'
);
foreach ($data as $key => $value) {
if (in_array($value, $empty_values)) {
if ($is_obj) {
$data->$key = '';
} else {
$data[$key] = '';
}
} elseif (strpos($value, '<') !== FALSE) { //has html characters
$value = htmlentities($value);
if ($is_obj) {
$data->$key = $value;
} else {
$data[$key] = $value;
}
}
}
}
我的代码只是摆脱了“空”值,但对您来说可能是一个很好的起点。