ウェブで検索してもいまいちピンとこなかったので,将来の自分のためにメモ.
例えばライセンス有効期間を示す’開始日’と’終了日’があるとき,開始日がずらされたら終了日も同じ日数分ずらす.
場合によっては別途,うるう年で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'
}
まずは,日付を扱いたい場所の’.php’に記述.
時間を扱いたい場合は’Time’,日時で扱いたい場合は’DateTime’があるので使い分ける.
期間開始日を文字列で受け取った.ここでは書式は’YYYY-mm-dd’だった.(他のケースは試していない)
同じく終了日.
日付の引き算.開始日から終了日まで何日間だったかが$valid_term_days
に格納される.
変更後の開始日を設定.$new_start_date_string
も書式は’YYYY-mm-dd’とするので,ちゃんとnewすることを忘れずに.(忘れるとエラーにはならず,意図しない日付が設定された.)
1日だけ後ろにずらしたい,
(たとえば$new_start_date_string
が実は別の有効期間の終了日なので翌日を開始日にしたい)
というときにはaddDaysでずらすことができる.
$end_date = $start_date;
と書いてはいけない.確かに同じ日付が$end_date
にセットされるが,この後で$end_dateをずらすと同じだけ$start_dateもずれることになるから.
ようするに,ちゃんと別のインスタンスにしておきましょう.前者は参照がセットされているので,同じ日付のデータを見ている.
終了日をずらした.