【问题标题】:PHP get days between start-date and end-datePHP获取开始日期和结束日期之间的天数
【发布时间】:2010-10-13 08:09:58
【问题描述】:

如果我有两个变量$startDate="YYYYmmdd"$endDate="YYYYmmdd",请问如何获取它们之间的天数?

谢谢。

【问题讨论】:

  • 请说明您想要包含或不包含两个日期的天数。
  • 包括开头和结尾,谢谢。

标签: php date datediff


【解决方案1】:

如果您使用的是 PHP 5.3,则可以使用新的 DateTime 类:

$startDate = new DateTime("20101013");
$endDate = new DateTime("20101225");

$interval = $startDate->diff($endDate);

echo $interval->days . " until Christmas"; // echos 73 days until Christmas

如果没有,你需要使用strtotime:

$startDate = strtotime("20101013");
$endDate = strtotime("20101225");

$interval = $endDate - $startDate;
$days = floor($interval / (60 * 60 * 24));

echo $days . " until Christmas"; // echos 73 days until Christmas

【讨论】:

  • 新的 DateTime、DateTimeInterval、DateTimePeriod 和 DateTimeZone 类非常棒。我也和他们做了一些经验。我认为它比 strtotime 更好,因为它考虑了闰年、闰秒等。所以为你 +1。我还在这篇文章中给出了一个更详细的例子:stackoverflow.com/questions/3108591/…
【解决方案2】:
<?php
function days($date1, $date2) {
    $date1 = strtotime($date1);
    $date2 = strtotime($date2);
    return ($date2 - $date1) / (24 * 60 * 60);
}
$date1 = '20100820';
$date2 = '20100930';
echo days($date1, $date2);
?>

【讨论】:

    【解决方案3】:
    $DayDiff = strtotime("2010-01-12")-strtotime("2009-12-30");
    echo  date('z', $DayDiff)." Days";
    

    这个应该是精确的并且可以与 PHP

    【讨论】:

      【解决方案4】:
      <?php   
       $time1=strtotime($startDate);
          $time2=strtotime($endDate);
          $daycount=floor(($time2-$time1)/ 86400);
      ?>
      

      【讨论】:

        【解决方案5】:

        这里是示例代码

        $startDate = mktime(0,0,0,1,1,2010); 
        $endDate = mktime(0,0,0,12,1,2010); 
        
        $dateDiff = $date1 - $date2;
        $fullDays = floor($dateDiff/(60*60*24));
        echo "Differernce is $fullDays days"; 
        

        【讨论】:

          【解决方案6】:

          我发现获得它们之间的天数的最简单方法是将开始日期和结束日期转换为 Unix 时间戳并对其进行减法。

          然后,如果您想格式化日期,请使用 PHP 日期函数将其转换回来。

          【讨论】:

            【解决方案7】:

            这是我的方法,在大多数情况下基于粗略的搜索,只是因为以秒为单位(几周、几个月、几年)可能无法返回精确的结果,例如在处理闰年时。

            <?php
            function datediff( $timeformat, $startdate, $enddate )
            {
                $unix_startdate = strtotime( $startdate ) ;
                $unix_enddate = strtotime( $enddate ) ;
                $min_date = min($unix_startdate, $unix_enddate);
                $max_date = max($unix_startdate, $unix_enddate);
                $Sd = date( "d", $unix_startdate ) ;
                $Sm = date( "m", $unix_startdate ) ;
                $Sy = date( "Y", $unix_startdate ) ;
                $Ed = date( "d", $unix_enddate ) ;
                $Em = date( "m", $unix_enddate ) ;
                $Ey = date( "Y", $unix_enddate ) ;
            
                $unixtimediff = $unix_enddate - $unix_startdate ;
                if ( $unixtimediff <= 0 ) return -1 ;
            
                switch( strtolower( $timeformat ) )
                {
                     case "d": // days
                     $divisor = 3600 * 24 ;
                     return floor( $unixtimediff / $divisor ) + 1 ; 
                     break ;
                     case "w": // weeks
                     $i = 0 ;
                     while ( ( $min_date = strtotime("+1 DAY", $min_date) ) <= $max_date) $i++;
                     return floor( $i / 7 ) ;
                     break ;
                     case "m": // months
                     $i = $Sd != $Ed && $Sm != $Em ? 1 : 0 ;
                     while ( ( $min_date = strtotime("+1 MONTH", $min_date) ) <= $max_date) $i++;
                     return $i ;
                     break ;
                     case "q": // quaterly (3 months)
                     $i = $Sd != $Ed && $Sm != $Em ? 1 : 0 ;
                     while ( ( $min_date = strtotime("+3 MONTH", $min_date) ) <= $max_date) $i++;
                     return $i ;
                     break ;
                     case "y": // year
                     $i = $Sd != $Ed && $Sm != $Em ? 1 : 0 ;
                     while ( ( $min_date = strtotime("+1 MONTH", $min_date) ) <= $max_date) $i++;
                     return floor( $i / 12 ) ;
                     break ;
                }
            }
            
            $startdate = "2014-01-01" ;
            $enddate = "2015-12-31" ;
            $formats = array( "d" => "days", "w" => "weeks", "m" => "months", "q" => "quaterly", "y" => "years" ) ;
            foreach( $formats AS $K => $F )
            echo "From $startdate to $enddate in $F format: ". datediff( "$K",  $startdate, $enddate )."<br>" ;
            

            ?>

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-06
              相关资源
              最近更新 更多