The DatePeriod constructor uses three syntaxes to iterate over dates and times:
DatePeriod($date, $dateInterval, $recurrences)
Use this syntax to iterate with the given number of recurrences.DatePeriod($startDate, $dateInterval, $endDate)
Use this syntax to iterate over a set of dates and times.DatePeriod($isostr)
This syntax uses ISO 8601 repeating interval specification.
The number of recurrences
Note: These examples use DateTime and DateInterval classes.
<?php $date = new DateTime('27-Jan-2022'); # 3-month interval $interval = new DateInterval('P3M'); $recurrences = 3; $period = new DatePeriod($date, $interval, $recurrences); foreach ($period as $date) { echo '['. $date->format('d-M-Y') . '] '; } # [27-Jan-2022] [27-Apr-2022] [27-Jul-2022] [27-Oct-2022]
Exclude the start date (or time) in iteration
Use the DatePeriod::EXCLUDE_START_DATE
constant in the DatePeriod constructor’s 4th parameter to exclude the first result :
<?php $date = new DateTime('27-Jan-2022'); # 3-month interval $interval = new DateInterval('P3M'); $occurences = 3; $exclude = DatePeriod::EXCLUDE_START_DATE; $period = new DatePeriod($date, $interval, $occurences, $exclude); foreach ($period as $date) { echo '['. $date->format('d-M-Y') . '] '; } # [27-Apr-2022] [27-Jul-2022] [27-Oct-2022]
Iterate over a set of dates and times
Example: Iterate over a set of seconds
<?php $start = new DateTime('03:31:01'); $end = new DateTime('03:31:04'); # 1 second interval $interval = new DateInterval('PT1S'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['.$date->format('H:i:s') . '] '; } # [03:31:01] [03:31:02] [03:31:03]
Use the DatePeriod::EXCLUDE_START_DATE
constant in the DatePeriod constructor’s 4th parameter to exclude the first result :
<?php $start = new DateTime('03:31:01'); $end = new DateTime('03:31:04'); # 1 second interval $interval = new DateInterval('PT1S'); $range = new DatePeriod( $start, $interval, $end, DatePeriod::EXCLUDE_START_DATE); foreach ($range as $date) { echo '['.$date->format('H:i:s') . '] '; } # [03:31:02] [03:31:03]
Example: Iterate over a set of minutes
<?php $start = new DateTime('03:31:01'); $end = new DateTime('10:51:08'); # 125-minute interval $interval = new DateInterval('PT125M'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['. $date->format('H:i:s') . '] '; } # [03:31:01] [05:36:01] [07:41:01] [09:46:01]
Example: Iterate over a set of hours
<?php $start = new DateTime('27-Jul-2022 03:31:01'); $end = new DateTime('22-Aug-2022 10:51:08'); # 300-hour interval $interval = new DateInterval('PT300H'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['. $date->format('d-M-Y H:i:s') . '] '; } # [27-Jul-2022 03:31:01] [08-Aug-2022 15:31:01] [21-Aug-2022 03:31:01]
Example: Iterate over a set of days
<?php $start = new DateTime('27-Jul-2022'); $end = new DateTime('22-Aug-2022'); # 10-day interval $interval = new DateInterval('P10D'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['. $date->format('d-M-Y') . '] '; } # [27-Jul-2022] [06-Aug-2022] [16-Aug-2022]
Example: Iterate over a set of weeks
<?php $start = new DateTime('27-Jul-2022'); $end = new DateTime('22-Aug-2022'); # 1-week interval $interval = new DateInterval('P1W'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['. $date->format('d-M-Y') . '] '; } # [27-Jul-2022] [03-Aug-2022] [10-Aug-2022] [17-Aug-2022]
Example: Iterate over a set of months
<?php $start = new DateTime('27-Jan-2022'); $end = new DateTime('22-Aug-2022'); # 3-month and 5-day interval $interval = new DateInterval('P3M5D'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['. $date->format('d-M-Y') . '] '; } # [27-Jan-2022] [02-May-2022] [07-Aug-2022]
Example: Iterate over a set of years
<?php $start = new DateTime('27-Jan-2018'); $end = new DateTime('22-Aug-2022'); # 1-year, 3-month and 5-day interval $interval = new DateInterval('P1Y3M5D'); $range = new DatePeriod($start, $interval, $end); foreach ($range as $date) { echo '['. $date->format('d-M-Y') . '] '; } # [27-Jan-2018] [02-May-2019] [07-Aug-2020] [12-Nov-2021]
The Date and Time Tutorials:
- PHP DateTime Class
- PHP DateTimeZone Class – times in different countries
- PHP DateInterval Class – adds or subtracts dates/times
- PHP DatePeriod Class – generates date or time ranges
- PHP Validating Age and Date of Birth
- Sunset, Sunrise, Transit, and Twilight
- Localizing Dates
- Localizing Dates with IntlDateFormatter Class