比较PHP中的日期时的奇怪问题

时间:2015-12-14 10:22:30

标签: php date strtotime

我在比较php中的两个日期时遇到了问题。

问题:当比较上午12:00(午夜)到例如上午10:00(上午)时,以下代码将无法正常运行。根据人类逻辑10:00 AM晚于12:00 AM。但计算机似乎没有意识到这一点。

有没有办法以不同的方式做到这一点?

date_default_timezone_set('Europe/Athens');
$today = date("d-m-Y h:i:s A");
$today = date("d-m-Y h:i:s A",strtotime($today));
$max = date('d-m-Y h:i:s A', strtotime("31-12-2015 23:59:00"));
$min = date('d-m-Y h:i:s A', strtotime("14-12-2015 00:00:01"));

if (($today > $min) && ($today < $max)){
    //do something
} else {
    //something else done
}

3 个答案:

答案 0 :(得分:2)

您可以使用date_create()&amp; date_diff() PHP内置函数,用于比较两个日期,在您的场景中它将对您有所帮助。

$date1 = date_create("2013-03-15"); 
$date2 = date_create("2013-12-12");
$diff = date_diff($date1,$date2);
echo $diff->format("%R%a days");

答案 1 :(得分:2)

因为date()返回String。

来自manual

  

返回值

     

返回格式化的日期字符串。如果将非数字值用于时间戳,则返回FALSE并发出E_WARNING级别错误。


基本上,你的代码试图做的是这样的:

if("31-12-2015 23:59:00 PM" < "14-12-2015 00:00:01 AM") {
    .......
}

因此,PHP将忽略“AM”或“PM”字符串,只是比较数值。

编辑:来自comparison operator手册:

  

如果您将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都为converted to a number,并且数字执行比较。

因此,因为PHP再次转换它们的值,所以您的代码完全比较了不同的值。

  

有没有办法以不同的方式做到这一点?

只需与strtotime值进行比较。

$today = strtotime("now");
$max = strtotime("31-12-2015 23:59:00");
$min = strtotime("14-12-2015 00:00:01");

if (($today > $min) && ($today < $max)){
        //do something

}else{
        //something else done
}

以后再使用date格式化您的值到AM / PM格式(如果需要)。

答案 2 :(得分:1)

试试这样..

date_default_timezone_set('Europe/Athens');
            $today = date("d-m-Y h:i:s A");                
            $max = date('d-m-Y h:i:s A', strtotime("31-12-2015 23:59:00"));
            $min = date('d-m-Y h:i:s A', strtotime("14-12-2015 00:00:01"));

            if ((strtotime($today) > strtotime($min)) && (strtotime($today) < strtotime($max))){
                    //do something

            }else{
                    //something else done

例如:

if (strtotime("12:00 AM")>strtotime("10:00 AM")){
 echo "do something";
}else{
 echo "something else done"; 
}

//输出“其他事情完成”;