[CakePHP]日付の足し算と引き算

ウェブで検索してもいまいちピンとこなかったので,将来の自分のためにメモ.

例題

例えばライセンス有効期間を示す’開始日’と’終了日’があるとき,開始日がずらされたら終了日も同じ日数分ずらす.
場合によっては別途,うるう年で2月29日が含まれる期間の場合は,期間が月間や年間で設定されているものとして1日足し引きすべきか考慮して調整する必要があるかもしれない.

答え

use Cake\I18n\Date

/**
 * 計算結果の$start_date, $end_dateはここでは計算しっぱなしで放置している.
 * 利用目的に沿うように適宜改変すること.
 */
private function updateStartEndDate($current_start_date, $current_end_date, $new_start_date)
{
    $start_date = new Date($current_start_date);
    $end_date = new Date($current_end_date);

    $valid_term_days = $end_date->diffInDays($start_date);

    $start_date = new Date($new_end_date);
    $start_date->addDays(1);
    $end_date = new Date($start_date);
    $end_date->addDays($valid_term_days);

    // 日数ではなく年数でよい場合(例えば5年.戻す場合は-5にする.)
    $years = 5;
    $end_date->modify($years.' years');    //<- '5 years'
}

use Cake\I18n\Date

 まずは,日付を扱いたい場所の’.php’に記述.
 時間を扱いたい場合は’Time’,日時で扱いたい場合は’DateTime’があるので使い分ける.

$start_date = new Date($input_start_date_string);

 期間開始日を文字列で受け取った.ここでは書式は’YYYY-mm-dd’だった.(他のケースは試していない)

$end_date = new Date($input_end_date_string);

 同じく終了日.

$valid_term_days = $end_date->diffInDays($start_date);

 日付の引き算.開始日から終了日まで何日間だったかが$valid_term_daysに格納される.

$start_date = new Date($new_start_date_string);

 変更後の開始日を設定.$new_start_date_stringも書式は’YYYY-mm-dd’とするので,ちゃんとnewすることを忘れずに.(忘れるとエラーにはならず,意図しない日付が設定された.)

$start_date->addDays(1);

 1日だけ後ろにずらしたい,
 (たとえば$new_start_date_stringが実は別の有効期間の終了日なので翌日を開始日にしたい)
というときにはaddDaysでずらすことができる.

$end_date = new Date($start_date);

 $end_date = $start_date;と書いてはいけない.確かに同じ日付が$end_dateにセットされるが,この後で$end_dateをずらすと同じだけ$start_dateもずれることになるから.
 ようするに,ちゃんと別のインスタンスにしておきましょう.前者は参照がセットされているので,同じ日付のデータを見ている.

$end_date->addDays($valid_term_days);

 終了日をずらした.