我有一个日历应用程序,它使用较新的 PHP DateTime 类。我有一种处理重复事件的方法,但它看起来很黑客,我想看看你们是否有更好的想法:
- 我有一个从 2009 年 11 月 16 日(2009 年 11 月 16 日)开始的重复事件
- 每 3 天发生一次
- 该事件将无限期地重复发生
假设用户查看 12 月 3100 年的日历 - 该事件应该像平常一样显示每 3 天重复一次。问题是 - 我如何计算该月的那些天数?
===========================================
我基本上就是这样做的,但我知道我错过了一些更简单的事情:
- 我计算所查看的月份开始日期(3100 年 12 月 1 日)与事件开始日期(2009 年 11 月 16 日)之间的天数差异,存储为 $daysDiff
- 我减去模数,这样我就得到了从一开始就得到 3 天的因子,如下所示: $daysDiff - ($daysDiff % 3)
- 为了便于讨论,我们假设日期为 3100 年 11 月 29 日。
- 然后,我反复向该日期添加 3 天,直到获得 3100 年 12 月内的所有日期
我的主要问题来自步骤 1。PHP DateInterval::date_diff 函数不计算天数差异。它会给我几年、几个月、几天。然后我必须捏造数字才能得到 3100 年 12 月左右的估计日期。
2009 年 11 月 16 日 + (1090 年 * 365.25 天) + (9 个月 * 30.5 天) + 15 天
当你真正进入遥远的未来,比如 9999 年,这个估计可能会偏差一个月,然后我必须减去很多 3 天的间隔才能到达我需要的地方。
使用 DatePeriod 作为迭代器,然后过滤到您想要显示的开始日期,可以很好地完成此操作:
<?php
class DateFilterIterator extends FilterIterator {
private $starttime;
public function __construct(Traversable $inner, DateTime $start) {
parent::__construct(new IteratorIterator($inner));
$this->starttime = $start->getTimestamp();
}
public function accept() {
return ($this->starttime < $this->current()->getTimestamp());
}
}
$db = new DateTime( '2009-11-16' );
$de = new DateTime( '2020-12-31 23:59:59' );
$di = DateInterval::createFromDateString( '+3 days' );
$df = new DateFilterIterator(
new DatePeriod( $db, $di, $de ),
new DateTime( '2009-12-01') );
foreach ( $df as $dt )
{
echo $dt->format( "l Y-m-d H:i:s\n" );
}
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)