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, $end, DatePeriod::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
The DatePeriod class
(PHP 5 >= 5.3.0)
Introduction
Represents a date period.
A date period allows iteration over a set of dates and times, recurring at regular intervals, over a given period.
Class synopsis
DatePeriod
implements
Traversable
{
/* Constants */
/* Methods */
public __construct
( DateTime
}$start
, DateInterval $interval
, int $recurrences
[, int $options
] )Predefined Constants
-
DatePeriod::EXCLUDE_START_DATE -
Exclude start date, used in DatePeriod::__construct().
Table of Contents
- DatePeriod::__construct — Creates a new DatePeriod object
jkaatz at gmx dot de ¶
3 years ago
Memori ¶
2 years ago
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)
?>
josh dot love at verizon dot net ¶
8 months ago
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>";
}
?>
logos-php at kith dot org ¶
9 months ago
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.
Aurelien Marchand ¶
2 years ago
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
