【问题标题】:Compare given date with today比较给定日期和今天
【发布时间】:2011-01-08 00:11:42
【问题描述】:

我有关注

$var = "2010-01-21 00:00:00.0"

我想将此日期与今天的日期进行比较(即我想知道此 $var 是否在今天之前或等于今天)

我需要使用什么功能?

【问题讨论】:

  • 我建议也设置时区

标签: php date datetime


【解决方案1】:
strtotime($var);

将其转化为时间价值

time() - strtotime($var);

为您提供自 $var 以来的秒数

if((time()-(60*60*24)) < strtotime($var))

将检查$var 是否在最后一天内。

【讨论】:

  • for php 4 从 $var = "2010-01-21 00:00:00.0" 退出最后一个 '.0',否则 strtotime 将返回 -1
  • 我使用的是 PHP 7.1。亚秒部分将被忽略,因为返回的是一个带秒数的整数。
【解决方案2】:

给你:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

另外,还有一些辅助函数:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

【讨论】:

  • 为什么会有奇怪的反向逻辑和无关的布尔值?为什么不只是“return strtotime($time) == strtotime('today')”、“return strtotime($time) > time()”和“return strtotime($time)
  • @Bobby Jack:我在这些功能中有更多功能,忘记删除额外的代码。现已修复。
  • +1 在辅助函数上,特别是 isPast b/c 我刚刚运行了一个 if(strtotime('2013-01-22 00:00:00.00') &lt; time()){....} 并为我做到了。
【解决方案3】:

该格式非常适合标准字符串比较,例如

if ($date1 > $date2){
  //Action
}

要以该格式获取今天的日期,只需使用:date("Y-m-d H:i:s")

所以:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

这就是这种格式的美妙之处:它的顺序很好。当然,这可能效率较低,具体取决于您的具体情况,但它也可能更方便并导致更可维护的代码 - 我们需要了解更多才能真正做到这一点判断电话。

对于正确的时区,您可以使用,例如,

date_default_timezone_set('America/New_York');

Click here 引用可用的 PHP 时区。

【讨论】:

  • 这也忽略了时区
  • @anushr,如果需要比较时区,可以在比较之前将时差添加到日期。这仍然比尝试将mm/dd/yyyy 格式的两个日期时间字符串转换为日期然后进行比较要快。当开发人员的系统中有多个时区的日期时,我总是很担心。我认为最好将日期存储在系统中,始终在单个时区中,然后在所需的任何时区中显示。我在 1998 年左右开始使用yyyy-mm-dd 格式(或yyyymmdd),当时我意识到即使在 SQL Server 中它的排序速度也要快得多。
  • 我以前用过类似的东西,但是让这个答案很容易获得真的很有帮助。当这个是字面日期时,不知道为什么他们选择第二个作为“最佳”!
  • 这对我来说效果很好,对于那些在时区放置位置上苦苦挣扎的人,您可以在 PHP 文件的任何位置包含代码 date_default_timezone_set('America/New_York');。要仅获取日期,请使用代码 date("Y-m-d")
【解决方案4】:

完成BoBby Jack,使用DateTime OBject,如果你有php 5.2.2+:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

【讨论】:

  • 这是不正确的。如果 $var 是当天(确切的午夜之后),则 new DateTime() 将大于 new DateTime($var) 并且 $var 在今天之前不是真的。
【解决方案5】:
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(以 w3schools 为例,效果很好)

【讨论】:

    【解决方案6】:
    $toBeComparedDate = '2014-08-12';
    $today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
    $expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');
    
    var_dump(strtotime($today) > strtotime($expiry)); //false or true
    

    【讨论】:

    • 在 OP 中我的 $var 也不等于
    • 你需要 PHP >= 5.4 for (new DateTime())->format('Y-m-d');
    【解决方案7】:

    您可以使用DateTime 类:

    $past   = new DateTime("2010-01-01 00:00:00");
    $now    = new DateTime();
    $future = new DateTime("2021-01-01 00:00:00");
    

    比较运算符起作用*:

    var_dump($past   < $now);         // bool(true)
    var_dump($future < $now);         // bool(false)
    
    var_dump($now == $past);          // bool(false)
    var_dump($now == new DateTime()); // bool(true)
    var_dump($now == $future);        // bool(false)
    
    var_dump($past   > $now);         // bool(false)
    var_dump($future > $now);         // bool(true)
    

    还可以从 DateTime 对象中获取时间戳值并进行比较:

    var_dump($past  ->getTimestamp());                        // int(1262286000)
    var_dump($now   ->getTimestamp());                        // int(1431686228)
    var_dump($future->getTimestamp());                        // int(1577818800)
    var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
    var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)
    

    * 请注意,=== 在比较两个不同的 DateTime 对象时返回 false,即使它们表示相同的日期。

    【讨论】:

    • $future 已成为过去。 :P
    • 我,时间过得真快。
    【解决方案8】:

    几年后,我赞同 Bobby Jack 的观点,即最后 24 小时不是今天!!!我很惊讶这个答案得到了如此多的支持......

    要比较某个日期是否小于、等于或大于另一个日期,首先您需要将它们“调低”到一天的开始。换句话说,请确保您在两个日期都在谈论相同的 00:00:00 时间。 这可以简单而优雅地完成为:

    strtotime("today") <=> strtotime($var)
    

    如果$var 的时间部分像指定的 OP 一样位于 00:00:00。

    用你需要的任何东西替换&lt;=&gt;(或者在php 7中保持这样)

    另外,很明显,我们谈论的是相同的时区。 对于list of supported TimeZones

    【讨论】:

      【解决方案9】:

      根据我的经验,请注意,如果您的目的仅涉及日期,请小心包含时间戳。例如,假设今天是"2016-11-09"。涉及时间戳的比较将使这里的逻辑无效。例如,

      //  input
      $var = "2016-11-09 00:00:00.0";
      
      //  check if date is today or in the future
      if ( time() <= strtotime($var) ) 
      {
          //  This seems right, but if it's ONLY date you are after
          //  then the code might treat $var as past depending on
          //  the time.
      }
      

      上面的代码看起来是对的,但如果只是要比较的日期,那么上面的代码逻辑不正确。为什么?因为, time() 和 strtotime() 将提供包含时间戳。也就是说,即使两个日期都在同一天,但时间差异很重要。考虑下面的例子:

      //  plain date string
      $input = "2016-11-09";
      

      由于输入是纯日期字符串,因此在 $input 上使用 strtotime() 将假定它是 2016 年 11 月 9 日的午夜。因此,在午夜之后的任何时间运行 time() 将始终将 $input 视为过去,即使它们是在同一天。

      要解决这个问题,您可以简单地编写代码,如下所示:

      if (date("Y-m-d") <= $input)
      {
          echo "Input date is equal to or greater than today.";
      }
      

      【讨论】:

      • 我确信 OP 考虑到了这一点,这就是他们在问题中包含 `00:00:00.0' 的原因
      【解决方案10】:

      从 w3schools 扩展 Josua 的回答:

      //create objects for the dates to compare
      $date1=date_create($someDate);
      $date2=date_create(date("Y-m-d"));
      $diff=date_diff($date1,$date2);
      //now convert the $diff object to type integer
      $intDiff = $diff->format("%R%a");
      $intDiff = intval($intDiff);
      //now compare the two dates
      if ($intDiff > 0)  {echo '$date1 is in the past';}
      else {echo 'date1 is today or in the future';}
      

      我希望这会有所帮助。我在 stackoverflow 上的第一篇文章!

      【讨论】:

        【解决方案11】:

        比较日期时间对象:

        (我选择了 10 天 - 任何超过 10 天的都是“旧”,否则为“新”)

        $now   = new DateTime();
        $yourdate = new DateTime("2021-08-24");
        $diff=date_diff($yourdate,$now);
        $diff_days = $diff->format("%a");
        if($diff_days > 10){
            echo "OLD! " . $yourdate->format('m/d/Y');
        }else{
            echo "NEW! " . $yourdate->format('m/d/Y');
        }
        

        【讨论】:

          【解决方案12】:

          如果你做事有时间和日期Carbon是你最好的朋友;

          然后安装包:

          $theDay = Carbon::make("2010-01-21 00:00:00.0");
          
          $theDay->isToday();
          $theDay->isPast();
          $theDay->isFuture();
          if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))
          

          lt = 小于, gt = 大于

          如题:

          $theDay->gt(Carbon::today()) ? true : false;
          

          还有更多;

          【讨论】:

            【解决方案13】:

            一些给定的答案没有考虑到当天!

            这是我的建议。

            $var = "2010-01-21 00:00:00.0"
            $given_date = new \DateTime($var);
            
            if ($given_date == new \DateTime('today')) {
              //today
            }
            
            if ($given_date < new \DateTime('today')) {
              //past
            }
            
            if ($given_date > new \DateTime('today')) {
              //future
            }
            

            【讨论】:

              【解决方案14】:
              // Try this
              if(date("Y-m-d",strtotime($funding_dt)) >= date("Y-m-d",strtotime('31-01-2007')))
              {
                  echo "ok";
              }else{
                  echo "not";
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-03-03
                • 2014-09-09
                • 1970-01-01
                相关资源
                最近更新 更多