gpt4 book ai didi

用于重复事件的 PHP 5.3 DateTime

转载 作者:可可西里 更新时间:2023-11-01 00:01:40 26 4
gpt4 key购买 nike

我有一个日历应用程序,它使用较新的 PHP DateTime 类。我有一种方法可以处理重复发生的事件,但它看起来有点乱七八糟,我想看看你们是否有更好的主意:

  1. 我有一个从 2009 年 11 月 16 日(2009 年 11 月 16 日)开始的重复性事件
  2. 每 3 天发生一次
  3. 该事件将无限期地重复发生

假设用户查看 3100 年 12 月的日历 - 该事件应该像往常一样每 3 天重复显示一次。问题是 - 我如何计算那个月的那些天数?

=========================================

这就是我的基本做法,但我知道我遗漏了一些更简单的东西:

  1. 我计算所查看月份的开始日期(3100 年 12 月 1 日)与事件开始日期(2009 年 11 月 16 日)之间的天数差异,存储为 $daysDiff
  2. 我减去模数,这样我就可以从开始得到 3 天的因数,如下所示:$daysDiff - ($daysDiff % 3)
  3. 为了论证,假设日期是 3100 年 11 月 29 日。
  4. 然后我在该日期上重复添加 3 天,直到所有日期都在 3100 年 12 月内

我的主要问题来自第 1 步。PHP DateInterval::date_diff 函数不计算天数差异。它会给我年、月、日。然后我不得不捏造数字以获得大约 3100 年 12 月的估计日期。11/16/2009 +(1090 年 * 365.25 天)+(9 个月 * 30.5 天)+ 15 天

当你进入 9999 年这样遥远的 future 时,这个估计可能会偏离一个月,然后我必须减去很多 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" );
}
?>

关于用于重复事件的 PHP 5.3 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1751380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com