【问题标题】:Weird issue when comparing dates in php比较php中的日期时出现奇怪的问题
【发布时间】:2015-12-14 10:22:30
【问题描述】:

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

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

有什么不同的方法吗?

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
}

【问题讨论】:

    标签: php date strtotime


    【解决方案1】:

    因为date()返回字符串。

    来自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】:

      您可以使用date_create() & 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");
      

      【讨论】:

      • 我不建议混合使用 OOP 和程序风格
      【解决方案3】:

      像这样试试..

      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"; 
      }
      

      //输出“做了别的事情”;

      【讨论】:

      • $today = date("d-m-Y h:i:s A"); $today = date("d-m-Y h:i:s A",strtotime($today)); 太多余了
      • 即使它确实有效,这两行也是完全多余的。
      • 我删除了那个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2013-12-27
      • 2018-12-25
      相关资源
      最近更新 更多