是否有一个PHP函数来测试零日期



寻找一种简便或更好的方法来测试零日期(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;
}

CarbonDateTime类不能用这种格式"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;
            }
        }
    }
}

我的代码只是去掉了"空"值,但对您来说可能是一个很好的起点。

相关内容

  • 没有找到相关文章

最新更新