【问题标题】:PHP - Get dates of next 5 weekdays?PHP - 获取接下来 5 个工作日的日期?
【发布时间】:2013-06-26 01:36:58
【问题描述】:

我正在尝试创建一个包含接下来 5 个工作日(周一至周五,不包括今天)的数组。我知道世界各地的工作时间各不相同,但这对我想做的事情并不重要。

因此,例如,如果今天是星期三,我想要本周的星期四和星期五以及下一周的星期一、星期二和星期三的日期。

我认为这会起作用:

$dates = array();

for ($i = 1; $ < 6; $i ++)
{
    $dates[] = date('Y-m-d', strtotime('+ '.$i.' weekday'));
}

但是今天,它给了我:

  • 星期一 1
  • 2 号星期二
  • 周三 3 日
  • 星期四 4 日
  • 7 号星期日!

任何建议表示赞赏。

谢谢

【问题讨论】:

  • 星期五和星期六不见了,你在中东吗?
  • 很奇怪...strtotime('yesterday+ '.$i.' weekday') 似乎为我修复了它(之后删除第一个元素)。那么一定是PHP中的一个错误......
  • 似乎有很多关于在 PHP 中使用此函数的错误报告 #63521 似乎是最新的。这里的答案可能有用http://stackoverflow.com/a/13131740/2310830,但基本上看起来您必须创建自己的代码才能正确执行此操作。

标签: php date strtotime


【解决方案1】:

试试这个

$dates = array();
$date = new DateTime();

while (count($dates)<5)
{
    $date->add(new DateInterval('P1D'));
    if ($date->format('N')<6)
        $dates[]=$date->format('Y-m-d');
}

【讨论】:

    【解决方案2】:
    function getWeekdayDatesFrom($format, $start_date_epoch, $end_date_epoch, $range) {
    
        $dates_arr = array();
    
        if( ! $range) {
            $range = round(abs($start_date_epoch-$end_date_epoch)/86400) + 1;
        } else {
            $range = $range + 1; //end date inclusive
        }
    
        $current_date_epoch = $start_date_epoch;
    
        for($i = 1; $i <= $range; $i+1) {
    
            $d = date('N',  $current_date_epoch);
    
            if($d <= 5) { // not sat or sun
                $dates_arr[] = "'".date($format, $current_date_epoch)."'";
            }
    
            $next_day_epoch = strtotime('+'.$i.'day', $start_date_epoch);
            $i++;
            $current_date_epoch = $next_day_epoch;
    
        }
    
        return $dates_arr;
    } 
    

    【讨论】:

    • 这应该回答问题,然后是一些。使用此函数,您可以声明返回格式(即 Y-m-d),声明开始日期和结束日期或开始日期和范围。我目前已将其设置为包括结束日期,并且默认情况下仅返回工作日(可以轻松撤消)。我还有用引号返回的日期,以便更容易地用于查询子句。
    【解决方案3】:

    这应该可行:

    $dates = array();
    $i = 0;
    
    while(true) {
        $i++;
    
        $time = strtotime("+$i days");
        $dayOfWeek = date('w', $time);
    
        /* 'w' - day of week, numeric, i.e. "0" (Sunday) to "6" (Saturday) */
        if( ($dayOfWeek == 0) or ($dayOfWeek == 6) ) {
            continue;
        }
    
        $dates[] = date('Y-m-d', $time);
    
        if( count($dates) >= 5 ) {
            break;
        }
    }
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      $now = time();
      $day = 60*60*24;
      $days = array();
      for ($i=1; $i<=7; $i++){
          $ts = $now + $day*$i;
          if (date("N", $ts) < 6){
              $days[] = date("l jS", $ts);
          }
      }
      

      上述代码的输出是:

      Array(
          [0] => Monday 1st
          [1] => Tuesday 2nd
          [2] => Wednesday 3rd
          [3] => Thursday 4th
          [4] => Friday 5th
      )
      

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 2022-11-24
        • 1970-01-01
        • 2013-12-11
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多