管理日程的辅助工具

v1.0.0 2013-08-19 23:56 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:52:25 UTC


README

当处理日期和日程时,PHP有两个内置辅助工具DateInterval和DatePeriod。使用这两个类可以让你走得更远。有一些事情需要注意。

  1. DatePeriod不是默认的,它使用Traversable接口,并且没有像next、current、rewind这样的方法。
  2. 您需要将您的周期与DateInterval中使用的DSL相匹配。
  3. 无法使用DatePeriod来表示非线性日期间隔,例如仅工作日。
  4. 如果您想稍后创建它,仍然需要设计一个将设置映射到DateInterval的方法。
  5. 如果想要从中间开始,您需要在代码中跳过给定的偏移量。

我编写了这个辅助工具来解决这些不足,我使用了一个构造器,它将接受一个字符串名称并返回一个Iterator。在构造期间,您可以要求迭代器跳过,并且我已经实现了以下常见周期。

  1. 年度
  2. 每周
  3. 每月
  4. 双周
  5. 工作日
  6. 双月
  7. 季度

示例

use DateTime;
use IComeFromTheNet\Schedule\ScheduleBuilder;

$start = new DateTime();
$reoccurance = 12;

$builder = new ScheduleBuilder();

return $builder->daily()
        ->start($start)
        ->limit($reoccurance)
        ->skipStart()
        ->build();
        

这创建了一个每天的计划,限制为12次发生,其中跳过了第一个周期。重要的是要注意,如果没有跳过起始周期,将有13次发生。这是PHP DatePeriod的一个特性,当使用整数设置限制时,这个数字是起始之后重新发生。总发生次数是起始次数 + 重新发生次数(限制)。

use DateTime;
use IComeFromTheNet\Schedule\ScheduleBuilder;


$start = new DateTime();
$reoccurance = 12;

$builder = new ScheduleBuilder();

return $builder->monthly()
        ->start($start)
        ->limit($reoccurance)
        ->offset(4)
        ->build();

这将返回一个每月的计划,其中有4次发生。如果起始月份是八月,则第一次起始值在十二月。使用LimitIterator来限制结果集。

use DateTime;
use IComeFromTheNet\Schedule\ScheduleBuilder;


$start = new DateTime();
$reoccurance = 12;

$builder = new ScheduleBuilder();

return $builder->create('monthly')
        ->start($start)
        ->limit($reoccurance)
        ->build();

这将返回一个每月的计划,规则是通过字符串定义的,而不是直接的方法调用。