【问题标题】:Subtracting two dates in php在php中减去两个日期
【发布时间】:2012-05-06 07:55:07
【问题描述】:

我在 php 中有两个日期

$date1 = 'May 3, 2012 10:38:22 GMT'

$date2 = '06 Apr 2012 07:22:21 GMT'

然后我把它们都减去

$date2 - $date1

,得到

Result:6

为什么结果是 6 而不是 27? ... ?我怎样才能减去这两个日期,并让它根据月份差异返回一个结果,同时减去年&日&时间?

【问题讨论】:

    标签: php


    【解决方案1】:

    第 1 部分:为什么结果是 6?

    当您第一次减去日期时,日期只是字符串。 PHP 尝试将它们转换为整数。它通过转换直到第一个非数字来做到这一点。因此,date2 变为 6,date1 变为 0。

    第 2 部分:如何让它发挥作用?

    $datetime1 = strtotime('May 3, 2012 10:38:22 GMT');
    $datetime2 = strtotime('06 Apr 2012 07:22:21 GMT');
    
    $secs = $datetime2 - $datetime1;// == <seconds between the two times>
    $days = $secs / 86400;
    

    根据需要进行转换。

    【讨论】:

    • 我是否需要将秒数在两次之间转换......到天数......没有更快的方法
    • 一天中的秒数 = 60*60*24 = 86,400 所以除以它。
    • 很好的解决方案@evan。竖起大拇指(y)
    【解决方案2】:

    使用DateTimeDateInterval

    $date1 = new DateTime("May 3, 2012 10:38:22 GMT");
    $date2 = new DateTime("06 Apr 2012 07:22:21 GMT");
    echo $date1->diff($date2)->format("%d");
    

    【讨论】:

    • 这将以天为单位返回我的差异..因为这就是我想要的..找到日期差异
    • 如果差值超过一个月,format("%d") 不会考虑这一点。所以它并不完美!请改用echo $date1-&gt;diff($date2)-&gt;days;
    • 这不是正确的答案,主要是因为 DateInterval 是一个可怕的对象:$date1 = new DateTime("May 3, 2012"); $date2 = new DateTime("06 Apr 2013"); $date1-&gt;diff($date2)-&gt;format("%d") // == 2 另外,-&gt;days 有时是错误的:(new DateInterval("P2Y100D"))-&gt;days // === false!
    【解决方案3】:

    大多数提出的解决方案似乎都在起作用,但每个人都忘记了一件事:时间。

    evan为例:

    $datetime1 = strtotime('May 3, 2012 10:38:22 GMT');
    $datetime2 = strtotime('06 Apr 2012 07:22:21 GMT');
    
    $secs = $datetime2 - $datetime1;// == <seconds between the two times>
    $days = $secs / 86400;
    

    如果您不修剪时间部分,可能会导致精确计算。例如:2014-05-01 14:00:00 (Y-m-d) 和 2014-05-02 07:00:00 之间的间隔将是 0,xxx,而不是 1。您应该修剪每个日期的时间部分。

    应该是这样的:

    $datetime1 = strtotime(date('Y-m-d', strtotime('May 3, 2012 10:38:22 GMT')));
    $datetime2 = strtotime(date('Y-m-d', strtotime('06 Apr 2012 07:22:21 GMT')));
    
    $secs = $datetime2 - $datetime1;// == <seconds between the two times>
    $days = $secs / 86400;
    

    【讨论】:

      【解决方案4】:

      有一种方法可以使用 mktime n 在时间戳中生成日期,然后减去,然后使用日期函数以您想要的方式显示......

      另一种方法是将两个日期格式化为相同的格式,然后减去....

      第三条路

      $date1=  new DateTime("May 3, 2012 10:38:22 GMT");
      $date2= new DateTime("06 Apr 2012 07:22:21 GMT");
      echo $date1->diff($date2)->("%d");
      

      第四条

      $datetime1 = strtotime('May 3, 2012 10:38:22 GMT');
      $datetime2 = strtotime('06 Apr 2012 07:22:21 GMT');
      $secs = $datetime2 - $datetime1;// == return sec in difference
      $days = $secs / 86400;
      

      【讨论】:

        【解决方案5】:
        echo 'time'.$notification_time=  "2008-12-13 10:42:00";
         date_default_timezone_set('Asia/Kolkata');
         echo 'cureen'.$currenttime=date('Y-m-d H:i:s'); 
        $now = new DateTime("$notification_time");
        $ref = new DateTime("$currenttime");
        $diff = $now->diff($ref);
        printf('%d days, %d hours, %d minutes', $diff->d, $diff->h, $diff->i);
        

        【讨论】:

          【解决方案6】:
          $todate= strtotime('May 3, 2012 10:38:22 GMT');
          $fromdate= strtotime('06 Apr 2012 07:22:21 GMT');
          $calculate_seconds = $todate- $fromdate; // Number of seconds between the two dates
          $days = floor($calculate_seconds / (24 * 60 * 60 )); // convert to days
          echo($days);
          

          此代码将查找两个日期之间的日期差异..

          这里的输出是 27

          【讨论】:

            【解决方案7】:

            如果你想使用 diff(它返回一个 Dateinterval 对象)方法,正确的方法是用 %a 格式化。我的意思是:

            如果你检查http://php.net/manual/en/dateinterval.format.php

            正确的做法是:

             echo $date1->diff($date2)->format("%a");
            

            为了得到所有的日子

            【讨论】:

            • 省略了方法名,正确的是:echo $date1->diff($date2)->format("%a");
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-10-27
            • 2012-06-07
            • 1970-01-01
            • 1970-01-01
            • 2015-01-03
            • 1970-01-01
            相关资源
            最近更新 更多