【问题标题】:PHP check if date between two datesPHP检查两个日期之间的日期
【发布时间】:2013-10-04 21:26:39
【问题描述】:

我从 Stackoverflow 获得了这段代码,并对其稍作更改以适用于今天的日期。

我想检查今天是否介于两个日期之间。但这不起作用。 我错过了什么?

$paymentDate = date('d/m/Y');
echo $paymentDate; // echos today! 
$contractDateBegin = date('d/m/Y', '01/01/2001');
$contractDateEnd = date('d/m/Y', '01/01/2015');

if ($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)
{
  echo "is between";
}
else
{
echo "NO GO!";  
}

【问题讨论】:

  • 如果您使用的是 php5,请查看no2.php.net/manual/en/datetime.diff.php上的 datetime.diff
  • 你真的是要使用 date() 还是 strtotime()?
  • 我使用了 strtotime 仍然得到“No Go!”;
  • 那么你应该阅读 strtotime() 接受的formats.... 但是 date() 绝对是错误的函数
  • 为什么是-1?这似乎是个好问题。我放置了我的代码,它有一些很好的 cmets。我认为这可能对其他人有帮助。

标签: php date


【解决方案1】:

编辑:使用&lt;=&gt;= 计算今天的日期。

这是您的代码的正确答案。只需使用strtotime() php 函数即可。

$paymentDate = date('Y-m-d');
$paymentDate=date('Y-m-d', strtotime($paymentDate));
//echo $paymentDate; // echos today! 
$contractDateBegin = date('Y-m-d', strtotime("01/01/2001"));
$contractDateEnd = date('Y-m-d', strtotime("01/01/2012"));
    
if (($paymentDate >= $contractDateBegin) && ($paymentDate <= $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}

【讨论】:

  • 谢谢您的好先生!也许删除您在顶部添加的答案并留下对我有用的答案可能会很好。不确定。
  • @PapaDeBeau:您必须记住,此解决方案中的 01/01/2001 日期是 m/d/Y 格式,而不是 d/m/Y
  • 我不会使用严格比较,所以这是最好的 $paymentDate >= $contractDateBegin 和 $paymentDate
  • if (($paymentDate > $contractDateBegin) && ($paymentDate = $contractDateBegin) && ($paymentDate
  • 当您提供在 unix 纪元之前开始的日期时,此解决方案以及此页面上的所有其他解决方案都会失败。试试 1942/07/28,看看会发生什么。
【解决方案2】:

您无法比较日期字符串。改用 PHP 的 DateTime 对象是个好习惯:

$paymentDate = new DateTime(); // Today
echo $paymentDate->format('d/m/Y'); // echos today! 
$contractDateBegin = new DateTime('2001-01-01');
$contractDateEnd  = new DateTime('2015-01-01');

if (
  $paymentDate->getTimestamp() > $contractDateBegin->getTimestamp() && 
  $paymentDate->getTimestamp() < $contractDateEnd->getTimestamp()){
  echo "is between";
}else{
   echo "NO GO!";  
}

【讨论】:

  • 再说一遍,肯定是php5的问题。我想我需要用godaddy更新它。我收到此错误:致命错误:调用未定义的方法 DateTime::getTimestamp()
  • 你使用的是什么 PHP 版本?
  • @PapaDeBeau:在 PHP 5 之前的版本上不可用。&lt;?php echo phpversion(); ?&gt; 输出什么?
  • 看起来 getTimestamp() 仅在 5.3 上受支持...但它是在 2009 年发布的 :)
  • 如果您在 $contractDateEnd 与当前日期相同时打印$paymentDate-&gt;getTimestamp() and $contractDateEnd-&gt;getTimestamp(),则会产生错误的结果。例如今天是 01/05/2015 但如果您更改 $contractDateEnd = new DateTime('2015-05-01');那么它将产生错误的时间戳。而不仅仅是$paymentDate = new DateTime();,您应该使用$paymentDate = new DateTime('2015-05-01') ,即。将当前日期传递给它
【解决方案3】:

如果时间很重要:

$paymentDate = strtotime(date("Y-m-d H:i:s"));
$contractDateBegin = strtotime("2014-01-22 12:42:00");
$contractDateEnd = strtotime("2014-01-22 12:50:00");

if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) {
   echo "is between";
} else {
    echo "NO GO!";  
}    

【讨论】:

    【解决方案4】:

    基于 luttken 的回答。以为我会添加我的转折:)

    function dateIsInBetween(\DateTime $from, \DateTime $to, \DateTime $subject)
    {
        return $subject->getTimestamp() > $from->getTimestamp() && $subject->getTimestamp() < $to->getTimestamp() ? true : false;
    }
    
    $paymentDate       = new \DateTime('now');
    $contractDateBegin = new \DateTime('01/01/2001');
    $contractDateEnd   = new \DateTime('01/01/2016');
    
    echo dateIsInBetween($contractDateBegin, $contractDateEnd, $paymentDate) ? "is between" : "NO GO!";
    

    【讨论】:

    • 在我看来这个答案应该是一个解决方案。
    【解决方案5】:

    另一种解决方案是考虑将日期写为 Ymd。

    以这种“格式”编写,比较日期非常容易。

    $paymentDate       = date('Ymd'); // on 4th may 2016, would have been 20160504
    $contractBegin     = 20010101;
    $contractEnd       = 20160101;
    echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between";
    

    它将始终适用于一年中的每一天,并且不依赖于任何函数或转换(PHP 将考虑 $paymentDate 的 int 值与 contractBegincontractEnd 的 int 值进行比较。

    【讨论】:

      【解决方案6】:

      您正在将日期作为字符串进行比较,这不起作用,因为比较是按字典顺序进行的。这与排序文本文件时的问题相同,其中一行 20 将出现在一行 100 之后,因为内容不被视为数字,而是作为 ASCII 代码序列。此外,创建的日期都是错误的,因为您使用的是字符串格式字符串,其中需要时间戳(第二个参数)。

      您应该比较 DateTime 对象的时间戳,例如:

       $paymentDate = date_create();
       $contractDateBegin = date_create_from_format('d/m/Y', '01/01/2001');
       $contractDateEnd = date_create_from_format('d/m/Y', '01/01/2015');
      

      您现有的条件将正常工作。

      【讨论】:

      • 我一定不会用php5吧?我收到此错误:调用未定义函数 date_create_from_format()
      • 试试date_create
      • @PapaDeBeau: date_create_from_format 是在 PHP 5.3 中引入的,它有 already reached end of life——但您使用的是更早的版本。如果可能的话,我建议升级今天
      • @OfirBaruch:不起作用,因为d/m/Y 不是supported formats 之一。
      • Downvoter:这个答案有问题吗?请留下评论帮助我改进它。
      【解决方案7】:

      如果您需要括号日期是动态的..

      $todayStr = date('Y-m-d');
      $todayObj=date('Y-m-d', strtotime($todayStr));
      $currentYrStr =  date('Y');
      $DateBegin = date('Y-m-d', strtotime("06/01/$currentYrStr"));
      $DateEnd = date('Y-m-d', strtotime("10/01/$currentYrStr"));
      if (($todayObj > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
          $period="summer";
      }else{
         $period="winter";  
      }
      

      【讨论】:

        【解决方案8】:

        简单的解决方案:

        function betweenDates($cmpDate,$startDate,$endDate){ 
           return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
        }
        

        【讨论】:

        • 你能解释一下这个的用法吗?
        【解决方案9】:

        可以使用mktime(时、分、秒、月、日、年)函数

        $paymentDate = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
        $contractDateBegin = mktime(0, 0, 0, 1, 1, 2001); 
        $contractDateEnd =  mktime(0, 0, 0, 1, 1, 2012);
        
        if ($paymentDate >= $contractDateBegin && $paymentDate <= $contractDateEnd){
            echo "is between";
        }else{
            echo "NO GO!";  
        }
        

        【讨论】:

          【解决方案10】:

          直接使用

          $paymentDate = strtotime(date("d-m-Y"));
          $contractDateBegin = strtotime("01-01-2001");
          $contractDateEnd = strtotime("01-01-2015");
          

          然后比较就可以了,因为您的 01-01-2015 对 PHP 的 32 位日期范围有效,如 strtotime 的手册中所述。

          【讨论】:

            【解决方案11】:

            另一种解决方案(假设您知道您的日期格式始终为 YYYY/MM/DD 并带有前导零)是 max() 和 min() 函数。我认为这没关系,因为所有其他答案也假设 yyyy-mm-dd 格式,如果您想确保它们按日期顺序排序,这是文件系统中文件夹的通用命名约定。

            正如其他人所说,给定数字的顺序,您可以比较字符串,不需要 strtotime() 函数。

            例子:

            $biggest = max("2018/10/01","2018/10/02");
            

            优点是您可以在其中添加更多日期,而不仅仅是比较两个。

            $biggest = max("2018/04/10","2019/12/02","2016/03/20");
            

            要确定日期是否在两个日期之间,您可以比较 min() 和 max() 的结果

            $startDate="2018/04/10";
            $endDate="2018/07/24";
            $check="2018/05/03";
            if(max($startDate,$check)==min($endDate,$check)){
                // It's in the middle
            }
            

            它不适用于任何其他日期格式,但它可以。无需转换为秒,也无需日期函数。

            【讨论】:

              【解决方案12】:

              上述方法很有用,但它们不是完全可靠的,因为如果时间在 12:00 AM/PM 和 01:00 AM/PM 之间会出错。尽管在时间之间,它将返回“No Go”。 这是相同的代码:

              $time = '2019-03-27 12:00 PM';
              
              $date_one = $time; 
              $date_one = strtotime($date_one);
              $date_one = strtotime("+60 minutes", $date_one);
              $date_one =  date('Y-m-d h:i A', $date_one);
              
              $date_ten = strtotime($time); 
              $date_ten = strtotime("-12 minutes", $date_ten); 
              $date_ten = date('Y-m-d h:i A', $date_ten);
              
              $paymentDate='2019-03-27 12:45 AM';
              
              $contractDateBegin = date('Y-m-d h:i A', strtotime($date_ten)); 
              $contractDateEnd = date('Y-m-d h:i A', strtotime($date_one));
              
              echo $paymentDate; 
              echo "---------------"; 
              echo $contractDateBegin; 
              echo "---------------"; 
              echo $contractDateEnd; 
              echo "---------------";
              
              $contractDateEnd='2019-03-27 01:45 AM';
              
              if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)  
              {  
               echo "is between";
              } 
              else
              {  
                echo "NO GO!";  
              }
              

              在这里你会得到输出"NO Go",因为12:45 &gt; 01:45

              要在两者之间获得正确的输出日期,请确保 "AM" 的值从 01:00 AM12:00 AM 将转换为 24 小时格式。这个小技巧帮助了我。

              【讨论】:

                【解决方案13】:

                因为我很懒:

                $paymentDate = new DateTime();
                $contractStartDate = new Datetime('01/01/2001');
                $contractEndDate = new Datetime('01/01/2015');
                $payable = $paymentDate < $contractEndDate && $contractStartDate > $paymentDate; //bool
                
                var_dump($payable)
                

                显示:

                bool(false)
                

                作为一个函数

                function isPayable(DateTime $payDate, DateTime $startDate, DateTime $endDate):bool 
                {
                    return $payDate > $startDate && $payDate < $endDate;
                }
                
                var_dump(isPayable(new DateTime(), new Datetime('01/01/2001'), new DateTime('01/01/2015')));
                var_dump(isPayable(new DateTime('2003-03-15'), new Datetime('2001-01-01'), new DateTime('2015-03-01')));
                
                
                

                显示:

                bool(false)
                bool(True)
                

                【讨论】:

                  【解决方案14】:
                  function get_format($df) {
                  
                      $str = '';
                      $str .= ($df->invert == 1) ? ' - ' : '';
                      if ($df->y > 0) {
                          // years
                          $str .= ($df->y > 1) ? $df->y . ' Years ' : $df->y . ' Year ';
                      } if ($df->m > 0) {
                          // month
                          $str .= ($df->m > 1) ? $df->m . ' Months ' : $df->m . ' Month ';
                      } if ($df->d > 0) {
                          // days
                          $str .= ($df->d > 1) ? $df->d . ' Days ' : $df->d . ' Day ';
                      } 
                  
                      echo $str;
                  }
                  
                  $yr=$year;
                  $dates=$dor;
                  $myyear='+'.$yr.' years';
                  $new_date = date('Y-m-d', strtotime($myyear, strtotime($dates)));
                  $date1 = new DateTime("$new_date");
                  $date2 = new DateTime("now");
                  $diff = $date2->diff($date1);
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-08-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-07-19
                    相关资源
                    最近更新 更多