• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DatePeriod::__construct()

    (PHP 5 >= 5.3.0, PHP 7)

    Creates a new DatePeriod object

    说明

    publicDatePeriod::__construct(DateTimeInterface$start,DateInterval$interval,int $recurrences[,int $options])publicDatePeriod::__construct(DateTimeInterface$start,DateInterval$interval,DateTimeInterface$end[,int $options])publicDatePeriod::__construct(string $isostr[,int $options])

    Creates a new DatePeriod object.

    参数

    $start

    The start date of the period.

    $interval

    The interval between recurrences within the period.

    $recurrences

    The number of recurrences.

    $end

    The end date of the period.

    $isostr

    An ISO 8601 repeating interval specification.

    $options

    Can be set toDatePeriod::EXCLUDE_START_DATEto exclude the start date from the set of recurring dates within the period.

    更新日志

    版本说明
    5.5.8$endtype changed toDateTimeInterface. Previously,DateTime.
    5.5.0$starttype changed toDateTimeInterface. Previously,DateTime.

    范例

    DatePeriod example

    <?php
    $start = new DateTime('2012-07-01');
    $interval = new DateInterval('P7D');
    $end = new DateTime('2012-07-31');
    $recurrences = 4;
    $iso = 'R4/2012-07-01T00:00:00Z/P7D';
    // All of these periods are equivalent.
    $period = new DatePeriod($start, $interval, $recurrences);
    $period = new DatePeriod($start, $interval, $end);
    $period = new DatePeriod($iso);
    // By iterating over the DatePeriod object, all of the
    // recurring dates within that period are printed.
    foreach ($period as $date) {
        echo $date->format('Y-m-d')."\n";
    }
    ?>
    

    以上例程会输出:

    2012-07-01
    2012-07-08
    2012-07-15
    2012-07-22
    2012-07-29
    

    DatePeriod example withDatePeriod::EXCLUDE_START_DATE

    <?php
    $start = new DateTime('2012-07-01');
    $interval = new DateInterval('P7D');
    $end = new DateTime('2012-07-31');
    $period = new DatePeriod($start, $interval, $end,
                             DatePeriod::EXCLUDE_START_DATE);
    // By iterating over the DatePeriod object, all of the
    // recurring dates within that period are printed.
    // Note that, in this case, 2012-07-01 is not printed.
    foreach ($period as $date) {
        echo $date->format('Y-m-d')."\n";
    }
    ?>
    

    以上例程会输出:

    2012-07-08
    2012-07-15
    2012-07-22
    2012-07-29
    

    注释

    Unbound numbers of repetitions as specified by ISO 8601 section 4.5 "Recurring time interval" are not supported, i.e. neither passing"R/..."as$isostrnor passingNULLas$endwould work.

    I found two things useful to know that aren't covered here.
    1. endDate is excluded:
    <?php
    $i = new DateInterval('P1D');
    $d1 = new Datetime();
    $d2 = clone $d1; $d2->add($i);
    foreach(new DatePeriod($d1, $i, $d2) as $d) {
      echo $d->format('Y-m-d H:i:s') . "\n";
    }
    ?>
    Will output:
    2010-11-03 12:39:53
    (Another one because I got it wrong at first)
    2. For the first form, recurrences really means REcurrences, not occurences.
    <?php
    $i = new DateInterval('P1D');
    $d = new Datetime();
    foreach(new DatePeriod($d, $i, 1) as $d) {
      echo $d->format('Y-m-d H:i:s') . "\n";
    }
    ?>
    Will output:
    2010-11-03 12:41:05
    2010-11-04 12:41:05
    When you add the time 23:59:59 to the end DateTime object something like the following then the end date will be included in the period:
    <?php
    $date_start = new DateTime('2012-03-12');
    $date_end = new DateTime('2012-03-22 23:59:59');
    $interval = '+2 days';
    $date_interval = DateInterval::createFromDateString($interval);
    $period = new DatePeriod($date_start, $date_interval, $date_end, DatePeriod::EXCLUDE_START_DATE);
    foreach($period as $dt) {
     echo $dt->format('d/m');
    }
    ?>
    OUTPUT:
    14/03
    16/03
    18/03
    20/03
    22/03