web-dev-qa-db-ja.com

営業日(月〜金)PHP

strtotimeを使用して、就業日(月曜日から金曜日)を日付に追加する方法はありますか?または他の方法?私がやりたいことは:

date ( 'Y-m-j' , strtotime ( '+3 working days' ) )
44
fredley

平日に限定する場合は、文字列weekdaysを使用します。

echo date ( 'Y-m-j' , strtotime ( '3 weekdays' ) );

これにより、平日が3日早くなります。木曜日の場合は、週末が追加されます。

ソース: http://www.php.net/manual/en/datetime.formats.relative.php

95
John Giotta

PHP> = 5.6

public function addWorkingDays($date, $day)
{

    if (!($date instanceof \DateTime) || is_string($date)) {
        $date = new \DateTime($date);
    }

    if ($date instanceof \DateTime) {
        $newDate = clone $date;
    }

    if ($day == 0) {
        return $newDate;
    }

    $i = 1;

    while ($i <= abs($day)) {

        $newDate->modify(($day > 0 ? ' +' : ' -') . '1 day');

        $next_day_number = $newDate->format('N');

        if (!in_array($next_day_number, [6, 7])) {
            $i++;
        }

    }

    return $newDate;

}
2
ghindows

大量の平日が必要なときに、このバグが見つかりました。今月の1日からX営業日を探し​​ていました。

5営業日を追加した後まで、最初は見栄えが良かった(@zerkmsが見つけたものと同様)。

これは私にとってより正確であることが証明されました。

    function _getBusinessDayOfMonth( $days ) { 
        $time = strtotime(date("m/1/Y 00:00")); //finding # of business days after 1st of the month
        $i = 0; //start with zero
        while ($i < $days) { //loop through until reached the amount of weekdays
            $time = strtotime("+1 day", $time); //Increase day by 1
            if (date("N", $time) < 6) { //test if M-F
                $i++; //Increase by 1
            }
        }
        echo date("m/d/Y", $time);
    }
2
mpickens

私は再帰的にそれを行い、私のために働いた

function add_work_days($date, $day){
    if($day == 0)
        return $date;

    $date->add(new DateInterval('P1D'));

    if(!in_array($date->format('N'), array('6', '7')))
        $day--;

    return add_work_days($date, $day);
}

$date  = add_work_days(new DateTime(), 3);
echo $date->format('d/m/Y');
0

関数は簡単に開発でき、週の何日も現在の日をエクスポートできず、2を追加すると5のmodが平日を簡単に提供できると思います。

function increaseWorkDay($workDayToProcess, $dayToAdd){
    if($workDayToProcess >= 4 && $workDayToProcess <= 6){
        $workDayToProcess= 4;
    }
    $workDayToProcess+= $dayToAdd;

    return $workDayToProcess % 5;
}

また、配列を使用して曜日名をエクスポートできます。この方法を代わりに使用することもできます。

0
CSelcukB

古いバージョンのPHP <5.3

function AddWorkingDays($startDate, $adddays)
{
  $retdate = $startDate;
  $sign = "+";
  if($adddays < 0){
    $adddays = $adddays*-1;
    $sign = "-";
  }
  while ($adddays > 0) {
    $retdate = date ( 'Y-m-d' , strtotime ( "$retdate {$sign}1 day" ) );

      $what_day = date("N", strtotime($retdate));
      if ( $what_day != 6 && $what_day != 7 ) // 6 and 7 are weekend
          $adddays--;

  };

  return $retdate;

}
0
ram