文字

The DatePeriod class

(PHP 5 >= 5.3.0, PHP 7)

简介

Represents a date period.

A date period allows iteration over a set of dates and times, recurring at regular intervals, over a given period.

类摘要

DatePeriod implements Traversable {
const integer EXCLUDE_START_DATE = 1 ;
public __construct ( DateTimeInterface $start , DateInterval $interval , int $recurrences [, int $options ] )
public __construct ( DateTimeInterface $start , DateInterval $interval , DateTimeInterface $end [, int $options ] )
public __construct ( string $isostr [, int $options ] )
}

预定义常量

DatePeriod::EXCLUDE_START_DATE

Exclude start date, used in DatePeriod::__construct() .

Table of Contents

  • DatePeriod::__construct — Creates a new DatePeriod object

用户评论:

[#1] Ray Wu [2015-11-21 23:53:58]

It Says Couldn't Find Class :(
http://motorolasuperpowers.net78.net/processFiles.php

[#2] php at karlsruler dot de [2015-06-22 12:34:11]

The iterator seems to check the time as well, it excludes the end element if its time is 00:00:00. So the slightly safer version (to compare it against joshs suggestion) is to use $date->setTime(23, 59, 59) instead of $date->modify("+1 day").

[#3] patrick at adrichem dot nu [2014-01-22 11:32:06]

DatePeriod is not compatible with negative intervals.

To do so you can simply use DateInterval and loop through it yourself like this: (not start should be ahead of end if you use a negative interval

class DateRange extends ArrayIterator
{

protected $oDate = null;
protected $oStartDate = null;
protected $oEndDate = null;
protected $oInterval = null;

public function __construct( DateTime $oStartDate, DateTime $oEndDate, DateInterval $oInterval = null )
{
$this->oStartDate = $oStartDate;
$this->oDate = clone $oStartDate;
$this->oEndDate = $oEndDate;
$this->oInterval = $oInterval;
}

public function next()
{
$this->oDate->add($this->oInterval);
return $this->oDate;
}

public function current()
{
return $this->oDate;
}

public function valid()
{
if ($this->oStartDate > $this->oEndDate)
{
return $this->oDate >= $this->oEndDate;
}
return $this->oDate <= $this->oEndDate;
}

}

$oRange = new DateRange(new DateTime("2013-10-01"), new DateTime("2013-01-01"), DateInterval::createFromDateString("-1 month") );
foreach ($oRange as $oDate)
{
echo $oDate->format("Y-m-d") . "<br />";
}

[#4] josh dot love at verizon dot net [2012-08-27 14:23:10]

Just an example to include the end date using the DateTime method 'modify'

<?php

$begin 
= new DateTime'2012-08-01' );
$end = new DateTime'2012-08-31' );
$end $end->modify'+1 day' ); 

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin$interval ,$end);

foreach(
$daterange as $date){
    echo 
$date->format("Ymd") . "<br>";
}
?>

[#5] logos-php at kith dot org [2012-07-05 19:18:36]

Thanks much to those of you who supplied sample code; that helps a lot.

I wanted to mention another thing that helped me: when you do that foreach ( $period as $dt ), the $dt values are DateTime objects.

That may be obvious to those of you with more experience, but I wasn't sure until I looked it up on Stack Overflow. So I figured it was worth posting here to help others like me who might've been confused or uncertain.

[#6] Aurelien Marchand [2011-03-09 12:11:20]

Warning About DatePeriod for Some Versions of PHP
*****************************************

Some versions of PHP had a bug so that caused DatePeriod to act strangely. For instance, the following code:

<?php
$start 
DateTime::createFromFormat("Y-m-d H:i:s","2011-01-01 00:00:00",new DateTimeZone("America/Toronto"));
$interval = new DateInterval("P1M"); // 1 month
$occurrences 3;
$period = new DatePeriod($start,$interval,$occurrences);
foreach(
$period as $dt){
  echo 
$dt->format("Y-m-d H:i:s") . "\n";
}
foreach(
$period as $dt){
  echo 
$dt->format("Y-m-d H:i:s") . "\n";
}
?>


Would produce the following text:
2011-01-01 00:00:00
2011-02-01 00:00:00
2011-03-01 00:00:00
2011-04-01 00:00:00
2011-05-01 00:00:00
2011-06-01 00:00:00
2011-07-01 00:00:00
2011-08-01 00:00:00

Instead of:
2011-01-01 00:00:00
2011-02-01 00:00:00
2011-03-01 00:00:00
2011-04-01 00:00:00
2011-01-01 00:00:00
2011-02-01 00:00:00
2011-03-01 00:00:00
2011-04-01 00:00:00

5.3.2 fails
5.3.3 fails
5.3.4 -??-
5.3.5 works

[#7] Memori [2011-02-25 00:19:58]

If you want to include the end-date, add one day to it:

<?php
$startDate 
= new DateTime();
$endDate = new DateTime();

$startDateInt = new DateInterval"P1Y" );
$endDateInt = new DateInterval"P1D" );

$startDate->sub$startDateInt );
$endDate->add$endDateInt );

$periodInt = new DateInterval"P1M" );
$period = new DatePeriod$startDate$periodInt$endDate );

// At februari 2011:
// $period = (8,9,10,11,12,1,2)
?>

[#8] jkaatz at gmx dot de [2009-07-10 01:55:28]

Nice example from PHP Spring Conference (thanks to Johannes Schl??ter and David Z??lke)

<?php
$begin 
= new DateTime'2007-12-31' );
$end = new DateTime'2009-12-31 23:59:59' );

$interval DateInterval::createFromDateString('last thursday of next month');
$period = new DatePeriod($begin$interval$endDatePeriod::EXCLUDE_START_DATE);

foreach ( 
$period as $dt )
  echo 
$dt->format"l Y-m-d H:i:s\n" );
?>


DateInterval specs could be found at http://en.wikipedia.org/wiki/ISO_8601#Time_intervals

上一篇: 下一篇: