【问题标题】:How can I compare two dates in PHP?如何在 PHP 中比较两个日期?
【发布时间】:2011-04-20 08:24:21
【问题描述】:

如何在 PHP 中比较两个日期?

日期以如下格式存储在数据库中

2011-10-2

如果我想将今天的日期与数据库中的日期进行比较,看看哪个更大,我该怎么做?

我试过了,

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

但它实际上并不是这样工作的。还有什么办法?

【问题讨论】:

标签: php date compare


【解决方案1】:

如果您的所有日期都晚于 1970 年 1 月 1 日,您可以使用类似的内容:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

如果您使用的是 PHP 5 >= 5.2.0,则可以使用 DateTime 类:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

或者类似的东西。

【讨论】:

  • 如果我没记错的话,关于1st of January of 1970 的担忧只适用于在 Windows 上运行的旧版本 PHP,而在 Unix 上从来都不是问题。
  • 现在不是“如果您的所有日期都晚于 1970 年 1 月 1 日”和“早于 2038 年”吗?观看我们的 y2k38 错误。 strtotime 对于较大的日期将返回 false。 stackoverflow.com/questions/2012589/…
  • 请注意,DateTime 方法是首选方法。该对象可以做的远远超过strtotime
  • new DateTime('now') 也可以检索今天的日期
  • @Breith 就用new DateTime(),也是一样的。此外,在用户输入错误的情况下,构造函数可能会抛出异常,因此请确保已处理。
【解决方案2】:

在数据库中日期看起来像这样 2011-10-2

将其存储在 YYYY-MM-DD 中,然后字符串比较将起作用,因为 '1' > '0' 等。

【讨论】:

  • 但是如果它们看起来像这样,2011-10-02 和 2012-02-10,月份比较 1 > 0,但是 2011-10-02
  • @Davo,比较在第一个不同的字符处停止。在这种情况下,'1'的第四位数字
  • 下面的工作2016-03-27 11:59:47 ::: 2016-03-14 10:30:00吗?
【解决方案3】:

只是为了补充已经给出的答案,请参见以下示例:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

更新: 或者简单使用老派date()函数:

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

【讨论】:

  • 日期是一个函数,而不是一个类/构造函数。
  • @spdionis 感谢您的评论,我更改了大写字母以消除可能的混淆。
【解决方案4】:

我不会用 PHP 做这个。 数据库应该知道今天是星期几。(例如使用 MySQL->NOW() ),因此在查询中比较并返回结果将非常容易,根据使用的日期类型没有任何问题

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

【讨论】:

  • 谢谢,但我实际上使用 date() 我不将今天的日期存储在数据库中
  • 但是您将 expireDate 存储在数据库中。将此日期与 NOW() 进行比较
【解决方案5】:
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

【讨论】:

    【解决方案6】:

    这里有一种方法可以在几分钟内获得两个日期之间的差异

    // set dates
    $date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
    // date now
    $date_compare2= date("d-m-Y h:i:s a", strtotime($date2));
    
    // calculate the difference
    $difference = strtotime($date_compare1) - strtotime($date_compare2);
    $difference_in_minutes = $difference / 60;
    
    echo $difference_in_minutes;
    

    【讨论】:

    • 问题是要求比较 2 个日期 - 您的答案是添加大量额外的东西(即设置在线/离线状态),这对于问题的答案是不必要的。进行比较的答案部分与现有答案here 几乎相同。
    • 更新了问题,我在错误的问题中发布了错误的答案 ^^ ;) 这与答案不一样,只是添加了我对如何比较它们并在几分钟内得到差异的输入。
    • 由于您的更新,我已经删除了我的反对票,现在看起来好多了:)
    【解决方案7】:

    您可以将日期转换为 UNIX 时间戳,并以秒为单位比较它们之间的差异。

    $today_date=date("Y-m-d");
    $entered_date=$_POST['date'];
    $dateTimestamp1 = strtotime($today_date);
    $dateTimestamp2 = strtotime($entered_date);
    $diff= $dateTimestamp1-$dateTimestamp2;
    //echo $diff;
    if ($diff<=0)
       {
         echo "Enter a valid date";
       }
    

    【讨论】:

      【解决方案8】:

      我也遇到了这个问题,我通过以下方式解决了它:

      $today = date("Ymd");
      $expire = str_replace('-', '', $row->expireDate); //from db
      
      if(($today - $expire) > $NUMBER_OF_DAYS) 
      { 
          //do something; 
      }
      

      【讨论】:

      • 答案中应该解释为什么这种技术有效。
      • 请回答 OP 发布的问题,而不是您如何解决自己的独特场景。
      【解决方案9】:

      这是我关于如何使用 PHP 获得两个日期之间的天数差异的说明。 注意使用“!”感谢DateTime createFromFormat without time提供的信息,格式中丢弃了日期的时间部分。

      $today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
      $wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
      $diff = $today->diff($wanted);
      $days = $diff->days;
      if (($diff->invert) != 0) $days = -1 * $days;
      $overdue = (($days < 0) ? true : false);
      print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";
      

      【讨论】:

        【解决方案10】:

        如果您希望某个日期 ($date) 在某个时间间隔内过期,例如执行密码重置时的令牌过期日期,您可以这样做:

        $date = $row->expireDate;
        
        $date->add(new DateInterval('PT24H')); // adds 24 hours
        
        $now = new \DateTime();
        
        if($now < $date) { /* expired after 24 hours */ }
        

        但在您的情况下,您可以按以下方式进行比较:

        $today = new DateTime('Y-m-d');
        
        $date = $row->expireDate;
        
        if($today < $date) { /* do something */ }
        

        【讨论】:

        • 这个答案忽略了最初发布的问题。请使用 OP 提供的示例数据。
        • 这并不完全是这家伙在寻求帮助,但我认为如果理解这些原则,这种方式会有所帮助。
        • 我了解原理,但这段代码没有回答所提出的问题。这个页面已经被不正确和不相关的答案填满了——这只会让研究人员感到困惑并浪费他们的时间。我正在努力寻找研究人员。
        • 嗯,我认为这并不难,他可以使用 DateTime() 类而不是 date() 函数。我上面给出的答案是为了给研究人员一些想法。
        • 我将停止重复自己并退出这个讨论。第二高的解决方案 (stackoverflow.com/a/3847762/2943403) 展示了一种非常简单(无与伦比)的创建两个日期时间对象的方法。我完全不知道你神奇的requestDate() 方法是做什么的——任何地方都没有提到它。我不会使用您的答案,也不建议任何研究人员使用您的解决方案。我不认为自己会改变我的投票。
        【解决方案11】:

        在博客上找到了答案,很简单:

        strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400
        

        你会得到两个日期之间的天数。

        【讨论】:

        • 这似乎解决了另一个问题。请只回答 OP 提出的问题。
        【解决方案12】:

        这是因为 PHP 的字符串比较逻辑。只需您可以检查...

        if ($startdate < $date) {// do something} 
        if ($startdate > $date) {// do something}
        

        两个日期的格式必须相同。数字需要在左边补零,并从最重要到最不重要排序。 Y-m-dY-m-d H:i:s 满足这些条件。

        【讨论】:

        • d-m-Y 将不起作用.. Y-m-d(带有前导零,如 2016-05-08)将起作用。检查d-m-Y格式01-10-201620-02-2016的日期,比较为字符串0
        • 以下证明您的技术无法正确比较 OP 的日期与今天的日期:3v4l.org/SNHKT
        • OP 有不同的日期格式。 日期看起来像2011-10-2
        【解决方案13】:

        首先,尝试将您想要的格式设置为您服务器的当前日期时间:

        1. 获取当前日期时间

          $current_date = getdate();

        2. 单独的日期和时间以根据需要进行管理:

        $current_date_only = $current_date[year].'-'.$current_date[mon].'-'.$current_date[mday]; $current_time_only = $current_date['hours'].':'.$current_date['minutes'].':'.$current_date['seconds'];

        1. 根据您在数据库中使用的是多日期还是日期时间进行比较:

          $today = $current_date_only。' '.$current_time_only;

          $today = $current_date_only;

          如果($今天

        希望对你有帮助

        【讨论】:

        • 这个答案没有尝试解决原始问题。 OP 对小时、分钟或秒不感兴趣。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 2011-10-25
        • 2011-01-13
        相关资源
        最近更新 更多