Loop through dates with PHP

后端 未结 4 2034
粉色の甜心
粉色の甜心 2021-02-15 11:53

I am trying to loop through dates with PHP. Currently my code gets stuck in a loop repeating 110307. I need the date format to be in yymmdd. Here is what I was trying to use:

4条回答
  •  日久生厌
    2021-02-15 12:03

    Here is part of a code I use, can probably be improved, depends on PHP version you use.

    //usage
    $Iterator=class Dates_DateIterator::factory('Daily',
                                               new Datetime('20100227'),
                                               new Datetime('20100324'));
    
    foreach($Iterator as $i=>$day){
        var_dump($i);
        var_dump($day);
    }
    
    
    //code lib
    abstract class Dates_DateIterator implements Iterator
    {
        /**
         * Factory method, saves some code, also enable me to put everything in the same class 
         * as we use Autoload to load classes.
         */
        static public function factory($cycle,DateTime $DateI,DateTime $DateII){
            switch($cycle){
                case 'Daily':
                    return new DaysIterator($DateI,$DateII);
                case 'Weekly':
                    return new WeeksIterator($DateI,$DateII);
                case 'Monthly':
                    return new MonthsIterator($DateI,$DateII);
                case 'Yearly':
                    return new YearsIterator($DateI,$DateII);
                default:
                    throw(new Exception('No valid cycle was chosen to iterate over'));
            }
        }
        /**
         * @var DateTime represents the start range.
         */
        public $FromDate;
        /**
         * @var DateTime represents the end range.
         */
        public $ToDate;
        /**
         * @var DateTime Current Date.
         */
        protected $CurrentDate;
    
        public function __construct(DateTime $DateI,DateTime $DateII)
        {
            if($DateII->format('U') > $DateI->format('U'))
            {
                $this->FromDate=$DateI;
                $this->ToDate=$DateII;
                $this->CurrentDate=$DateI;
            }
            else
            {
                $this->FromDate=$DateII;
                $this->ToDate=$DateI;
                $this->CurrentDate=$DateII;
            }
        }//EOF constructor
    
        /**
         * @return DateTime
         */
        public function getClonedCurrent(){
            return clone($this->CurrentDate);   
        }
    
        public function current()
        {
            return $this->CurrentDate;
        }//EOF current
    
        public function currentDate()
        {
            return $this->CurrentDate->format('Ymd');
        }//EOF current
    
        public function rewind()
        {
            $this->CurrentDate=$this->FromDate;
        }//EOF rewind
    
        public function valid()
        {
            //Kill hours/minutes/seconds. If we are to add hours and minutes iterators, we will need to rethink this.
            return (floor($this->CurrentDate->format('U')/(3600*24)) <= floor($this->ToDate->format('U')/(3600*24)));
        }//EOF valid    
    }//EOF CLASS  DateIterator
    
    
    
    
    
    
    
    
    
    class DaysIterator extends SiTEL_Dates_DateIterator
    {
        public function __construct(DateTime $DateI,DateTime $DateII)
        {
            parent::__construct($DateI,$DateII);
        }//EOF constructor
    
        public function next()
        {
            $this->CurrentDate->modify('+1 day');
        }//EOF next
    
        public function key()
        {
            return $this->CurrentDate->format('d');
        }//EOF key
    
    }//EOD CLASS DaysIterator
    

提交回复
热议问题