0

だから、私はこの機能を持っています:

function calculateNextDate($startDate, $days)
{
    $dateTime = new DateTime($startDate);

        while($days) {
            $dateTime->add(new DateInterval('P1D'));    

            if ($dateTime->format('N') < 6) {
                $days--;
            }
        }

    return $dateTime->format('Y-m-d');
}

このように関数を実行すると、次のようになります。

echo calculateNextDate('2012-10-01', '10');

結果は次のようになります。

2012-10-15

これは正しいですが、カウント$startDateされた日としてカウントしたいので、次のようにカウントされます。

1. 2012-10-01
2. 2012-10-02
3. 2012-10-03
4. 2012-10-04
5. 2012-10-05
6. 2012-10-08
7. 2012-10-09
8. 2012-10-10
9. 2012-10-11
10. 2012-10-12

出来ますか?

4

3 に答える 3

1
<?
function calculateNextDate($startDate, $days)
{
    $dateTime = new DateTime($startDate);
        while($days > 0) {
            $weekend = date('w', strtotime($dateTime->format('Y-m-d')));
            if($weekend != '6' && $weekend != '0'){
                $new_date[] = $dateTime->format('Y-m-d');
                $days--;
            }
            $dateTime->add(new DateInterval('P1D'));    
        }
    return $new_date;
}

echo "<pre>";
print_r(calculateNextDate('2012-10-11', '10'));
?>

結果は次のようになります。

Array
(
    [0] => 2012-10-11
    [1] => 2012-10-12
    [2] => 2012-10-15
    [3] => 2012-10-16
    [4] => 2012-10-17
    [5] => 2012-10-18
    [6] => 2012-10-19
    [7] => 2012-10-22
    [8] => 2012-10-23
    [9] => 2012-10-24
)

配列をループすることで日付をエコーできます。

于 2012-10-15T07:47:07.460 に答える
1

最初に1日差し引くだけです

function calculateNextDate($startDate, $days)
{
  $oneDay = new DateInterval('P1D');
  $dateTime = new DateTime($startDate);
  $dateTime->sub($oneDay);

  while($days) {
    $dateTime->add($oneDay);
    if ($dateTime->format('N') < 6) {
      $days--;
    }
  }

  return $dateTime->format('Y-m-d');
}

echo calculateNextDate('2012-10-01', 10);
// results in 2012-10-12
于 2012-10-15T07:49:25.873 に答える
0

うーん、開始日に日を追加するだけのかなり複雑な方法

私はこれをこのように簡単に行います

$resultingDate = date('Y-m-d', strtotime("+$days days", $startDate));
于 2012-10-15T07:33:08.950 に答える