2 週間のブロック時間枠で支払われるサービスがあります。
- 03-31-13 から 04-13-13
- 04-14-13 から 04-27-13
- 04-28-13 から 05-11-13
- 等
1 週間前に終了した支払い期間を反映する日付に人々に支払いをしたいと考えています。
- 04-20-13 は、03-31-13 から 04-13-13 の期間の支払い日になります。
- 05-04-13 は、04-14-13 から 04-27-13 の期間の支払い日になります。
などなど
PHP でこれらの期間とやや「ローリング」間隔を計算する最良の方法は何でしょうか? 私はDateTime
クラスに慣れていませんが、これにどのようにアプローチするかはよくわかりません。
基本的には、ユーザーが請求ページにアクセスしたときに、現在の期間と、以前に終了した期間の支払いがいつ期待できるかを伝えることができるという考え方です。
アップデート
さらに考えてみると、どこから始めればよいかを知るために、何らかの基準点を与える必要があるように思えます。何か案は?
ありがとうございました。
更新 #2 - 私の解決策
class PayoutDate {
const PERIOD_LENGTH = 14;
public static $now;
public static $refStart;
public static $currentMonth;
public static $currentYear;
public static $currPeriodStart;
public static $currPeriodEnd;
public static $prevPeriodStart;
public static $prevPeriodEnd;
public function initialize(Controller $controller) {
self::$now = new DateTime();
self::$currentMonth = self::$now->format('m');
self::$currentYear = self::$now->format('Y');
self::$refStart = new DateTime("10/20/2013");
}
public function getPreviousPeriodStart() {
$daysIntoCurrentPeriod = ((int)self::$now->diff(self::$refStart)->format('%a') % self::PERIOD_LENGTH);
self::$prevPeriodStart = new DateTime('2 weeks ago');
self::$prevPeriodStart->sub(new DateInterval('P'.$daysIntoCurrentPeriod.'D'));
return self::$prevPeriodStart;
}
public function getPreviousPeriodEnd() {
$daysLeftCurrentPeriod = self::PERIOD_LENGTH - ((int)self::$now->diff(self::$refStart)->format('%a') % self::PERIOD_LENGTH) - 1;
self::$prevPeriodStart = new DateTime('2 weeks ago');
self::$prevPeriodStart->add(new DateInterval('P'.$daysLeftCurrentPeriod.'D'));
return (self::$prevPeriodStart);
}
public function getCurrentPeriodStart() {
$daysIntoCurrentPeriod = (int)self::$now->diff(self::$refStart)->format('%a') % self::PERIOD_LENGTH;
self::$currPeriodStart = clone self::$now;
self::$currPeriodStart->sub(new DateInterval('P'.$daysIntoCurrentPeriod.'D'));
return (self::$currPeriodStart);
}
public function getCurrentPeriodEnd() {
$daysLeftCurrentPeriod = self::PERIOD_LENGTH - ((int)self::$now->diff(self::$refStart)->format('%a') % self::PERIOD_LENGTH) - 1;
self::$currPeriodEnd = clone self::$now;
self::$currPeriodEnd->add(new DateInterval('P'.$daysLeftCurrentPeriod.'D'));
return (self::$currPeriodEnd);
}
public function getPreviousPeriodPayout() {
$prevEnd = new DateTime(self::getPreviousPeriodEnd());
return ($prevEnd->modify('next friday'));
}
public function getCurrentPeriodPayout() {
$currentEnd = new DateTime(self::getCurrentPeriodEnd());
return ($currentEnd->modify('next friday'));
}
}
このソリューションへのフィードバックや改善を歓迎します:)