寻找一种简便或更好的方法来测试零日期(MySQL datetime列),而不是:
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,但一个简单的hack方法是:
if(!(int)$row['this_date'])echo'No Date Set.';
你希望找到哪种更好的方法?它已经够快了。
注:这是一个hack,因为我假设你有一个年份集。这意味着它不会为字符串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)
数字可能需要根据时区进行调整
使用checkdate
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
上面的示例将输出:
bool(true)
bool(false)
http://php.net/manual/en/function.checkdate.php 我用这个函数来做同样的事情:
/**
* 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"解析零日期。
对于任何PHP框架,如Laravel,在迁移中使用可空列来在DB中存储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;
}
}
}
}
我的代码只是去掉了"空"值,但对您来说可能是一个很好的起点。