【问题标题】:Count iterations of PHP DatePeriod()计算 PHP DatePeriod() 的迭代次数
【发布时间】:2013-01-07 12:56:07
【问题描述】:

我了解日期期间如何工作,但有一个例外,有没有办法从日期期间找出有多少间隔?

例如:

// define the period of the range
$period = new DatePeriod($begin, $rangeType, $end);

// iterate through the dates in range
foreach ( $period as $dt ) {
}

这是我想从上面的代码中做的:

echo count($period);

基本上我想知道foreach 循环将运行多少次。

【问题讨论】:

    标签: php datetime iterator


    【解决方案1】:

    您可以为此使用iterator_count 函数:

    echo(iterator_count($period));
    

    【讨论】:

    • 请注意,iterator_count 在内部迭代所有项目以计算它们。因此,如果周期很大并且您无论如何都使用 foreach 对其进行迭代,您可以自己进行计数,这样会更有效率。
    【解决方案2】:

    假设您只对计算天数感兴趣(无论间隔规范如何)-谢谢@mark-amery 提出这个问题!

    另一种更明显的方法是区分 2 个日期并从结果中获取天数。

    $numDays = $end->diff($begin)->days;
    $numDaysFormatted = $end->diff($begin)->format('%d days');
    

    请务必验证您的 GET 变量以避免日期警告/错误。

    迟到总比没有好;-)

    编辑:

    如果您只有一个句点对象,则您可以访问句点的开始和结束。

    $numDays = $period
        ->getEndDate()
        ->diff($period->getStartDate())
        ->days;
    

    【讨论】:

    • -1;这假设 DatePeriod 有 1 天 DateInterval,但情况并非如此。
    【解决方案3】:
    class MyDatePeriod extends DatePeriod
    {
        public $dates;
    
        public function toArray()
        {
            if ($this->dates === null) {
                $this->dates = iterator_to_array($this);
            }
    
            return $this->dates;
        }
    }
    
    $p = new MyDatePeriod(date_create('2008-01-01'),
                          DateInterval::createFromDateString( "+2 days" ),
                          date_create('2008-12-31'));
    
    echo count($p->toArray()) . "\n"; // 183
    
    echo count($p->toArray()) . "\n"; // 183
    

    【讨论】:

    • 不...如果你必须通过继承来解决这个问题,至少实现Countable 接口而不是过于复杂的事情。但无论哪种方式,扩展 DatePeriod 都是不好的做法。
    • 扩展标准库是一种不好的做法?所有电子产品都爆炸了。
    • 是的,扩展类只是为了添加功能通常是个坏主意。请参阅Composition over Inheritance(或herehere。这里的一个干净的替代方案是Decorator,因为它允许独立添加多个功能。但对于这种特殊情况,这将是过度设计。iterator_count 和@987654328 @把工作做好。
    • 您确实意识到您提供的所有这些链接实际上都同意我的观点,对吗?他想要一个具有给定属性的 DateInterval。这并不是从橙色场景中重新定义苹果,橙色场景是组合优于继承的点(即应该始终考虑组合,但并不总是正确的方法)。装饰图案最适合一对多的组合。他没有问如何以 15 种不同的方式抽象一个内置类型。
    • 如果你仔细观察,这些链接比通常的“有一个”与“是一个”的论点更进一步。我看到这个案例是有争议的,但是你没有必要用这样的代码限制自己。而且他甚至不想要一个带有附加属性的 DatePeriod,他想对 DatePeriod 做一些 操作:计算它的项目。
    猜你喜欢
    • 2020-08-09
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多