检查日期是否为空。

13

在一个while循环中,如何仅在存在该日期的情况下显示日期?

例如:如果日期是0000-00-00,则不显示任何内容。

我目前按照以下方式读取日期,但当日期为0000-00-00时,我得到的是01-01-1970

date('d-m-Y', strtotime($row['date']))
6个回答

14

你应该先检查日期字段中是否包含日期或NULL。根据结果,你可以读取日期。

while ($row = mysql_fetch_array($result)) {

    if (strtotime($row['date']) != '0000-00-00') {

        mydate = date('d-m-Y', strtotime($row['date']));

    } else {
        mydate = '';
    }
}

问题在于我有这个while($row = mysql_fetch_array($result)){ date('d-m-Y', strtotime($row['date_out'])) },那么我该如何为每个循环执行if条件呢? - user1347219
请看我已经编辑过的答案。您可以在 while 循环中检查条件。 - Dhruvisha
尝试了很久后,仍然显示01-01-1970。我已经执行了以下操作:如果(strtotime($row['date'])!='0000-00-00') { $mydate = date('d-m-Y', strtotime($row['date'])); } else { $mydate =''; } 并且作为输出,我正在回显$mydate。 - user1347219
1
我通过以下方式进行了管理:$datetime = ($row['date']);if ($datetime !='0000-00-00'){ $mydate = date('d-m-Y', strtotime($datetime)); }else{ $mydate =''; }然后我只是回显了 $mydate,一切正常。感谢大家的帮助。 - user1347219
我很高兴你找到了解决方案。 - Dhruvisha
显示剩余2条评论

10

试一下这个,对我有效

while($row = mysql_fetch_array($result)){ 
 if(strtotime($row['date']) > 0){
   echo date('d-m-Y', strtotime($row['date']));
 }else{
   echo 'Date not valid or null';
 }
}

1
这个检查日期是否在1970年1月1日之后。早于那个日期的日期将被回显为无效,即使它是一个有效的日期。 - ffork

7
目前被接受的答案是错误的。
日期“0000-00-00”被解析为“-0001-11-30”。这在PHP手册的日期格式部分有解释。
可以溢出和下溢dd和DD格式。第0天表示上个月的最后一天,而溢出则计入下个月。这使得“2008-08-00”等同于“2008-07-31”,而“2008-06-31”等同于“2008-07-01”(六月只有30天)。
请注意,从PHP 5.1.0开始,日期范围限制为0-31,如上面的正则表达式所示。因此,“2008-06-32”不是有效的日期字符串。
也可以使用值0下溢mm和MM格式。月份值为0表示前一年的12月。例如,“2008-00-22”等同于“2007-12-22”。
如果结合前两个事实并下溢日和月,则会发生以下情况:“2008-00-00”首先转换为“2007-12-00”,然后转换为“2007-11-30”。这也发生在字符串“0000-00-00”中,它被转换为“-0001-11-30”(ISO 8601日历中的年份-1,在普通格里高利历中为公元前2年)。
如果您使用较旧的PHP版本或32位操作系统,则strtotime(“0000-00-00”)将返回false,但不是因为它认为它未设置,而是因为解析的日期(即公元前11月30日)超出了其可以处理的日期范围。在64位系统上使用新版本的PHP调用同一函数将返回一个类似于-62169984000的整数(取决于系统时区的轻微变化)。这是因为该系统可以处理提供的日期并正确返回1970年1月1日和公元前11月30日之间的秒数。
因此,在字符串“0000-00-00”上使用strtotime()来确定是否已设置是不正确的函数使用方法,并且不会返回所需的结果。由于在此问题中,“0000-00-00”字符串被视为默认未设置值,因此简单的字符串比较就足够了:
while($row = mysql_fetch_array($result)){
    if($row['date'] != '0000-00-00'){ // string comparison to see if set or not
        echo date('d-m-Y', strtotime($row['date']));
    }
}

请注意,在32位系统和旧版本的PHP中,这只适用于1901年12月13日至2038年1月19日之间的日期。超出此范围的日期将导致strtotime($row['date'])返回false,而date()函数会将其解释为0并返回“01-01-1970”,因为这是自1970年1月1日以来的0秒。

6
这个的简单方法是将 $row['date'] 作为整数进行评估并测试其值,就像这样:
if(!empty((int)$row['date']))
{
  echo "NOT empty";
}
else echo "EMPTY";

或者简短的版本:

!empty((int)$row['date']) ? echo "NOT empty" : echo "EMPTY";

1
你可以替换日期或时间字符串中的所有0-:值,然后检查是否为空。
if (empty(str_replace(array("0", "-", ":", " "), "", $mydate)))
{
  echo "empty date";
}
else
{
  echo "not empty date";
}

0

试试这个

foreach($row As $rows){
 if(strtotime($rows['date']) == ''){
    echo "N/A";
  }else{
echo date('d-m-Y', strtotime($rows['date']));
 }
echo "<br/>";

}

strtotime("0000-00-00")和("")是相等的。


5
是吗?我认为你错了。strtotime('0000-00-00')在我的环境下返回了 -62169984000 - ianbarker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接