此包的最新版本(dev-master)没有可用的许可信息。

日期/日历递归库

dev-master 2013-01-25 15:42 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:18:10 UTC


README

##When 适用于 PHP 5.2+ 的日期/日历递归库

作者:Thomas Planer

###关于 在进行了全面搜索后,我没有找到可以处理递归日期的 PHP 库。不过有: http://phpicalendar.org/,但是从应用程序中提取递归部分将非常困难。

奇怪的是,Ruby 和 Python 都有非常好的日期递归库

Ruby: http://github.com/seejohnrun/ice_cube

Python: http://labix.org/python-dateutil

由于我没有找到 PHP 的类似库,我创建了 When

###单元测试

测试是用 PHPUnit (http://www.phpunit.de/) 编写的

初始测试集是从 RFC5545 (http://tools.ietf.org/html/rfc5545) 中的示例创建的。

###文档

初始化类

$when = new When();

初始化类后,您可以通过调用 recur 方法创建一个周期性事件

$when->recur(<DateTime object|valid Date string>, <yearly|monthly|weekly|daily>);

您可以通过指定 limit() 限制要查找的日期数量

$when->limit(<int>);

或者您可以指定一个结束日期

$when->until(<DateTime object|valid Date String>);

注意:结束日期不一定要与周期性模式匹配。

注意:当达到限制或结束日期时,脚本将停止返回结果。

更多文档即将推出,请参考单元测试以了解类的能力。

###示例(更多示例请参阅单元测试)

下一个 5 个星期五 13 日的出现

$r = new When();
$r->recur(new DateTime(), 'monthly')
  ->count(5)
  ->byday(array('FR'))
  ->bymonthday(array(13));

while($result = $r->next())
{
	echo $result->format('c') . '<br />';
}

每隔四年,11月第一个星期一之后的第一个星期二,接下来的 20 年(美国总统选举日)

// this is the next election date
$start = new DateTime('2012-09-06');

$r = new When();
$r->recur($start, 'yearly')
  ->until($start->modify('+20 years'))
  ->interval(4)
  ->bymonth(array(11))
  ->byday(array('TU'))
  ->bymonthday(array(2,3,4,5,6,7,8));

while($result = $r->next())
{
	echo $result->format('c') . '<br />';
}

现在您可以将原始 RRULE 传递给类

$r = new When();
$r->recur('19970922T090000')->rrule('FREQ=MONTHLY;COUNT=6;BYDAY=-2MO');

while($result = $r->next())
{
	echo $result->format('c') . '<br />';
}

警告

  • 如果您提交的模板没有结果,脚本将无限循环。
  • 如果您没有指定结束日期(直到)或模式计数,您必须限制结果数量以避免无限循环

###贡献

如果您想贡献,请创建一个分支,并在提交更改后提交一个 pull request。

在提交 pull request 之前,请确保单元测试通过 100%。

当前有 78 个测试,1410 个断言。

>>>phpunit --verbose tests
PHPUnit 3.4.15 by Sebastian Bergmann.

tests
 When_Core_Tests
 ..

 When_Daily_Rrule_Test
 .....

 When_Daily_Test
 .....

 When_Iterator_Tests
 ..

 When_Monthly_Rrule_Test
 ..............

 When_Monthly_Test
 ..............

 When_Weekly_Rrule_Test
 ........

 When_Weekly_Test
 ........

 When_Rrule_Test
 ..........

 When_Yearly_Test
 ..........

Time: 2 seconds, Memory: 6.00Mb

OK (78 tests, 1410 assertions)

###许可

版权 (c) 2010 Thomas Planer

特此授予任何获得此软件及其相关文档文件(“软件”)副本的任何人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供方提供软件的人按以下条件进行操作:

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论源于合同行为、侵权行为或其他,无论是否与软件或其使用或其他方式相关。