3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?php // Initial datetimes $date1 = new DateTime('2012-03-22 11:29:16'); $date2 = new DateTime('2012-03-24 03:58:58'); // Set first datetime to midnight of next day $start = clone $date1; $start->modify('+1 day'); $start->modify('midnight'); // Set second datetime to midnight of that day $end = clone $date2; $end->modify('midnight'); // Count the number of full days between both dates $days = 0; // Loop through each day between two dates $interval = new DateInterval('P1D'); $period = new DatePeriod($start, $interval, $end); foreach ($period as $dt) { // If it is a weekend don't count it if (!in_array($dt->format('l'), array('Saturday', 'Sunday'))) { $days++; } } print "<pre>"; print_r($period); print "</pre>"; // Assume 8 hour workdays $hours = $days * 8; // Get the number of hours worked on the first day $date1->modify('5:30 PM'); $diff = $date1->diff($start); $hours += $diff->h; // Get the number of hours worked the second day $date1->modify('8 AM'); $diff = $date2->diff($end); $hours += $diff->h; echo $hours;
based on d19AT
Output for 7.1.0 - 7.2.0
<pre>DatePeriod Object ( [start] => DateTime Object ( [date] => 2012-03-23 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [current] => DateTime Object ( [date] => 2012-03-24 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [end] => DateTime Object ( [date] => 2012-03-24 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [interval] => DateInterval Object ( [y] => 0 [m] => 0 [d] => 1 [h] => 0 [i] => 0 [s] => 0 [f] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 ) [recurrences] => 1 [include_start_date] => 1 ) </pre>17
Output for 5.4.30 - 7.0.20
<pre>DatePeriod Object ( [start] => DateTime Object ( [date] => 2012-03-23 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [current] => DateTime Object ( [date] => 2012-03-24 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [end] => DateTime Object ( [date] => 2012-03-24 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [interval] => DateInterval Object ( [y] => 0 [m] => 0 [d] => 1 [h] => 0 [i] => 0 [s] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 ) [recurrences] => 1 [include_start_date] => 1 ) </pre>17
Output for 5.3.27 - 5.3.29, 5.4.17 - 5.4.29
<pre>DatePeriod Object ( [start] => DateTime Object ( [date] => 2012-03-23 00:00:00 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [current] => DateTime Object ( [date] => 2012-03-24 00:00:00 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [end] => DateTime Object ( [date] => 2012-03-24 00:00:00 [timezone_type] => 3 [timezone] => Europe/Amsterdam ) [interval] => DateInterval Object ( [y] => 0 [m] => 0 [d] => 1 [h] => 0 [i] => 0 [s] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 ) [recurrences] => 1 [include_start_date] => 1 ) </pre>17
Output for 5.3.19 - 5.3.26, 5.4.0 - 5.4.16
<pre>DatePeriod Object ( ) </pre>17