【问题标题】:PHP date calculate date between two dayPHP日期计算两天之间的日期
【发布时间】:2014-11-19 03:40:05
【问题描述】:

我想通过我只知道$startDate$endDate 来获取周末数和工作日数,有没有可以自动计算的PHP 函数?

这是我的代码:

 $endDate = strtotime($endDate);
 $startDate = strtotime($startDate);
 echo $days = ($endDate - $startDate) / 86400 + 1; 

我的代码将返回多少天,而我需要更多的是哪一天? 我怎样才能得到它?

例子:

startDate:`2014-11-17`

endDate:`2014-11-19`

我想要这个输出:

it's 3 day
2014-11-17 is Monday
2014-11-18 is Tueday
2014-11-19 is Wendnesday

【问题讨论】:

    标签: php date datetime-format


    【解决方案1】:

    怎么样...

    for ($time = $startDate; $time <= $endDate; $time += 86400) {
        echo date('Y-m-d \i\s l', $time) . '<br>';
    }
    

    【讨论】:

      【解决方案2】:

      这可能会对你有所帮助,或者至少会给你一些线索

      $endDate = strtotime($endDate);
      $startDate = strtotime($startDate);
      echo $days = ($endDate - $startDate) / 86400 + 1;
      $time = $startDate;
      while ($time <= $endDate) {
         echo date('Y-m-d', $time) . ' is ' . date('l', $time);
         $time += 86400;
      }
      if ($time != $endDate) {
         echo date('Y-m-d', $time) . ' is ' . date('l', $time);
      }
      

      【讨论】:

        【解决方案3】:

        这应该适合你:

        <?php
        
            $startDate = strtotime("2014-11-17");
            $endDate = strtotime("2014-11-19");
        
            echo "It's " . $days = ($endDate - $startDate) / 86400 + 1 . " days";
        
            for($count = 0; $count < $days; $count++)
                echo "<br />" . date('Y-m-d', strtotime('+' . $count . ' day', $startDate)) . ' is ' . date('l', strtotime('+' . $count . ' day', $startDate));
        
        ?>
        

        输出:

        It's 3 days
        2014-11-17 is Monday
        2014-11-18 is Tuesday
        2014-11-19 is Wednesday
        

        【讨论】:

          【解决方案4】:

          没有内置的。 Excel 有 NETWORKDAYS(),但在 PHP 中你必须自己动手。

          Day difference without weekends 有一个 PHP 解决方案 请注意它在 cmets 中的限制,例如如果公共假期恰逢周末。

          以下页面描述了 NETWORKDAYS() 的替代实现:http://www.cpearson.com/excel/betternetworkdays.aspx 它不是 PHP,但它演示了逻辑。

          不幸的是,除了循环遍历期间的每一天并决定是否计算它之外,没有捷径可走。您需要接受(或硬编码)周末和任何公共假期日期的参数(如果您不包括公共假期)。

          如果您频繁且长时间地执行此操作,您可能会预先计算并缓存每个日历月和年的工作日数;然后,在运行时,您查找该期间内每一年的天数,然后是剩余的整个月,然后在该期间的开始和结束时对剩余的天数进行普通循环。

          编辑:如果您只想排除周末(不是公共假期),那么您可以计算该期间内每一整周的 5 天,然后计算剩余天数:https://github.com/bgarlock/scripts/blob/master/PHP%20Equivalent%20of%20MS%20Excel%20NETWORKDAYS%20function.php

          【讨论】:

            【解决方案5】:

            请找到下面的代码,我相信它对你有用

            注意:通过 P1D 的参数表示 1 天的差异,同样您可以通过 P1M 1 个月 P1W 1 周和 P1Y 1 年。

            $date1 = '29/08/2013';
            $date2 = '03/09/2013';
            
            function returnDates($fromdate, $todate) {
                $fromdate = \DateTime::createFromFormat('d/m/Y', $fromdate);
                $todate = \DateTime::createFromFormat('d/m/Y', $todate);
                return new \DatePeriod(
                $fromdate,
                new \DateInterval('P1D'),
                $todate->modify('+1 day')
            );
            }
            
            $datePeriod = returnDates($date1, $date2);
            foreach($datePeriod as $date) {
                echo $date->format('d/m/Y'), PHP_EOL; //you can set any date format here
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-02-26
              • 2019-09-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多