6

私は多くのアプローチを試みていますが、途中で立ち往生しています。

注文が今日作成されたとしましょう。次の定期注文がいつ発生するかを表示する必要があります。そのため、2012 年 6 月 13 日に作成された注文があります。次に、毎月 1 日、隔月の繰り返し注文にスケジュールを設定しました。次の定期注文がいつ発生するかを計算する方法は? 答えは8月1日です。

誰かがアプローチを概説できれば、それは非常に便利です。コードである必要はありません。これは私がこれまでに持っているものです...

    // first, get starting date
    $start_date_month = date('m', strtotime($start_date));

    // get this year
    $this_year = date('Y');

    // if this month is december, next month is january
    $this_month = date('m', $timestamp_month);
    if($this_month == 12){
      $next_month = 1;
    // if this month is not december add 1 to get next month
    }else{
      $next_month = $this_month + 1;
    }

    // get array of months where recurring orders will happen
    $months = array();
    for ($i=1; $i<=6; $i++) {
      $add_month = $start_date_month+(2*$i); // 2, 4, 6, 8, 10, 12
      if($add_month == 13){$add_month = 1;$year = $this_year+1;}
      elseif($add_month == 14){$add_month = 2;$year = $this_year+1;}
      elseif($add_month == 15){$add_month = 3;$year = $this_year+1;}
      elseif($add_month == 16){$add_month = 4;$year = $this_year+1;}
      elseif($add_month == 17){$add_month = 5;$year = $this_year+1;}
      elseif($add_month == 18){$add_month = 6;$year = $this_year+1;}
      elseif($add_month == 19){$add_month = 7;$year = $this_year+1;}
      elseif($add_month == 20){$add_month = 8;$year = $this_year+1;}
      else{$year = $this_year;}
      echo $what_day.'-'.$add_month.'-'.$year.'<br />';
      $months[] = $add_month;
    }

    echo '<pre>';
    print_r($months);
    echo '</pre>';

今から 2 か月後の日付を単純に見つけたいわけではありません。注文が 6 月 1 日に作成されたとします。次の定期注文は 8 月 1 日です。次に、今日は 9 月 1 日ですが、次の定期注文は 10 月 1 日であるとします。私のジレンマがわかりますか?

4

5 に答える 5

5

現在の月を取ると、6 月なので 6 になり6 mod 2 == 0ます。来月は 7 月で、7 を取得し7 mod 2 == 1ます。

かどうかを確認してくださいcurrent month % 2 == (first month % 2)

次に、それが月の 1 日かどうかを確認します。

PHP では、モジュラスはパーセント記号で定義されます。

$month = date('n');
$createdMonth = 6;
if($month % 2 == $createdMonth % 2){
    // stuff
}
于 2012-06-13T19:53:52.553 に答える
4

これにはWhen usefulという名前のライブラリが見つかるかもしれません(私は作成者です)。

次の 2 つの定期的な月次日付 (今日の日付から) を取得するコードを次に示します。

include 'When.php';

$r = new When();
$r->recur(new DateTime(), 'monthly')
  ->count(2)
  ->interval(2) // every other month
  ->bymonthday(array(1));

while($result = $r->next())
{
    echo $result->format('c') . '<br />';
}

// output
// 2012-08-01T13:33:33-04:00
// 2012-10-01T13:33:33-04:00

これをさらに一歩進めると、最初の 2 営業日だけを見つけたい場合があります。

include 'When.php';

$r = new When();
$r->recur(new DateTime(), 'monthly')
  ->count(2)
  ->interval(2)                                 // every other month
  ->byday(array('MO', 'TU', 'WE', 'TH', 'FR'))  // week days only
  ->bymonthday(array(1, 2, 3))                  // the first weekday will fall on one of these days
  ->bysetpos(array(1));                         // only return one per month

while($result = $r->next())
{
    echo $result->format('c') . '<br />';
}

// output
// 2012-08-01T13:33:33-04:00
// 2012-10-01T13:33:33-04:00

また、コードは現在書き直されていることに注意してください。うまく動作しますが、少し混乱しており、十分に文書化されていません。

于 2012-06-13T20:28:52.287 に答える
2

次の 6 つの注文が必要だとします。

$order_date = '6/13/2012';
$start      = date('Y-m-01', strtotime($order_date));

$order_count = 6;

$future_orders = array();

$next = strtotime('+2 months', strtotime($start));
while(count($future_orders) < $order_count){
    $future_orders[] = date('m/d/Y',$next);
    $next = strtotime('+2 months', $next);
}

これは明らかに改善することができますが、それはあなたが始めるのに役立つはずです...

于 2012-06-13T20:12:05.603 に答える
2

私はこれを得た:

$today = new DateTime();
$target_date = $today->modify("first day of +2 months");

echo "Your event is on " . $target_date->format("d/m/Y") . "!";
于 2012-06-13T19:56:48.477 に答える