我们正在创建一个非常通用的订购系统,该系统根据支付周期的当前一周向用户支付款项。
我们的支付周期是双周,因此我们认为第 1 周将是奇数周,第 2 周将是偶数周。
- 第 1 周(奇数)[开始期间 A]
- 第 2 周(偶数)[结束期 A]
- 第 3 周(奇数)[开始时段 B]
- 第 4 周(偶数)[结束期 B] [支付期 A 本周星期五]
- 第 5 周(奇数)[开始期 C]
- 第 6 周(偶数)[结束期 C] [支付期 B 本周星期五]
等等。
我们可以使用以下方法来确定是奇数周还是偶数周:
self::$now = new DateTime();
if (self::$now->format('W') % 2 === 0) {
// Week is even -
} else {
// Week is odd
}
如果是奇数周,我们希望将该周的星期日用作当前支付周期的“开始日期”。另一方面,如果是偶数周,我们希望取该周的星期六并将其用作当前支付周期的“结束日期”。
以前,我们计算这些开始和结束日期的方法相当粗糙。我们只是选择了一个任意日期作为两周支付周期的第一个日期,并且会使用一些杂乱DateTime()
的代码来计算差异等等。我们不想这样做,而是依赖于一周是偶数还是奇数。
这是我们用来计算之前的开始和结束日期的代码:
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);
}
再说一次,我知道这很糟糕而且很草率,这就是我想要改进它的原因!
一旦我们确定了当前支付周期的开始和结束日期,我们希望能够确定以下值:
- 当前支付期开始
- 当前支付期结束
- 上一个支付期开始
- 上一个支付期结束
- 上一期支付日期(这将是上一个支付期的支付日期 - 在当前支付期开始之前结束的那个)[这将发生在下一个偶数支付期的星期五]
- 当前周期支付日期(这将是当前支付周期的支付日期)[这将发生在下一个 EVEN 支付周期的星期五]
我试图找到最干净、最理智的方法来处理这个问题。如果这种方法或方法不理想,我欢迎任何替代建议 - 我只是想确保这是准确且可维护的!