Цикл свиданий с PHP - PullRequest
       10

Цикл свиданий с PHP

8 голосов
/ 06 марта 2011

Я пытаюсь перебрать даты с помощью PHP.В настоящее время мой код застревает в цикле, повторяющем 110307. Мне нужно, чтобы формат даты был в гггмм.Вот что я пытался использовать:

<?php
    $check_date = '100227';
    $end_date = '100324';

    while($check_date != $end_date){
        $check_date = date("ymd", strtotime("+1 day", strtotime($check_date)));
        echo $check_date . '<br>';  
    }
?>

Ответы [ 4 ]

8 голосов
/ 06 марта 2011

Попробуйте использовать метку времени Unix и каждый раз добавлять 86400. Это должно быть быстрее, чем звонить strtotime(). Вы можете поиск конверсий меток времени онлайн .

<?php
    $check_date = 1267228800; // '2010-02-27';
    $end_date = 1269388800; // '2010-03-24';

    while($check_date != $end_date){
        $check_date += 86400;
        echo date("Ymd", $check_date) . '<br>';  
    }
?>
5 голосов
/ 06 марта 2011

strtotime интерпретирует "100227" как время 10:02:27 сегодня, а не 2010-02-27. Таким образом, после первого шага $check_date (сегодня) - это «110307». На всех последующих этапах «110307» снова интерпретируется как время сегодня, давая $check_date как «110307» снова.

Удобный трюк для итерации дат - воспользоваться возможностью mktime нормализовать даты, что-то вроде этого:

$date_arr = array(27,2,2010);
$end_date = "100324";
do {
    $check_date = gmdate('ymd', gmmktime(0,0,0,$date_arr[1],$date_arr[0]++,$date_arr[2]));
    echo $check_date."\n";
} while($end_date!=$check_date);
3 голосов
/ 05 июля 2013

Вот как я предпочитаю это делать:

$startDate = new DateTime('20100227');
$endDate = new DateTime('20100324');

while ($startDate <= $endDate) {
  // your code here
  ...
  // go to the next day
  $startDate->add(new DateInterval('P1D'));
}

Лично я нахожу это намного чище, и хорошо, что нет необходимости жестко кодировать значения, например 84600.

2 голосов
/ 06 марта 2011

Вот часть кода, который я использую, возможно, его можно улучшить, зависит от используемой версии PHP.

//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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...