How to Count Days Between Two Dates in PHP

Finding the number of days between two dates

$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

How to count days between two dates in PHP?

Here is the raw way to do it

$startTimeStamp = strtotime("2011/07/01");
$endTimeStamp = strtotime("2011/07/17");

$timeDiff = abs($endTimeStamp - $startTimeStamp);

$numberDays = $timeDiff/86400; // 86400 seconds in one day

// and you might want to convert to integer
$numberDays = intval($numberDays);

Count the days between two dates

This will check whether start date is less than end date. If yes, then it will display the days.

<?php

if($days = getWorkingDays("2017-05-01","2018-01-01")){
echo $days;
}

function getWorkingDays($startDate,$endDate){
$startDate = strtotime($startDate);
$endDate = strtotime($endDate);

if($startDate <= $endDate){
$datediff = $endDate - $startDate;
return floor($datediff / (60 * 60 * 24));
}
return false;
}
?>

Output: 245

Functions Used:

  1. strtotime(): The strtotime() function parses an English textual datetime into a Unix timestamp
  2. floor(): The floor() function rounds a number DOWN to the nearest integer

Edit-1: Getting Days After Excluding Weekends (saturdays & sundays)

//getWorkingDays(start_date, end_date)
if($days = getWorkingDays("2017-05-01","2018-01-01")){
echo $days;
}

function getWorkingDays($startDate,$endDate){

$days = false;
$startDate = strtotime($startDate);
$endDate = strtotime($endDate);

if($startDate <= $endDate){
$datediff = $endDate - $startDate;
$days = floor($datediff / (60 * 60 * 24)); // Total Nos Of Days

$sundays = intval($days / 7) + (date('N', $startDate) + $days % 7 >= 7); // Total Nos Of Sundays Between Start Date & End Date
$saturdays = intval($days / 7) + (date('N', $startDate) + $days % 6 >= 6); // Total Nos Of Saturdays Between Start Date & End Date

$days = $days - ($sundays + $saturdays); // Total Nos Of Days Excluding Weekends
}
return $days;
}
?>

Sources:

  1. calculate sundays between two dates
  2. The intval() function is used to get the integer value of a variable.
  3. See Description date('N', $date) : N - The ISO-8601 numeric representation of a day (1 for Monday, 7 for Sunday)

How to calculate the difference between two dates using PHP?

Use this for legacy code (PHP < 5.3). For up to date solution see jurka's answer below

You can use strtotime() to convert two dates to unix time and then calculate the number of seconds between them. From this it's rather easy to calculate different time periods.

$date1 = "2007-03-24";
$date2 = "2009-06-26";

$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

printf("%d years, %d months, %d days\n", $years, $months, $days);

Edit: Obviously the preferred way of doing this is like described by jurka below. My code is generally only recommended if you don't have PHP 5.3 or better.

Several people in the comments have pointed out that the code above is only an approximation. I still believe that for most purposes that's fine, since the usage of a range is more to provide a sense of how much time has passed or remains rather than to provide precision - if you want to do that, just output the date.

Despite all that, I've decided to address the complaints. If you truly need an exact range but haven't got access to PHP 5.3, use the code below (it should work in PHP 4 as well). This is a direct port of the code that PHP uses internally to calculate ranges, with the exception that it doesn't take daylight savings time into account. That means that it's off by an hour at most, but except for that it should be correct.

<?php

/**
* Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
* implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
*
* See here for original code:
* http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
* http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
*/

function _date_range_limit($start, $end, $adj, $a, $b, $result)
{
if ($result[$a] < $start) {
$result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
$result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
}

if ($result[$a] >= $end) {
$result[$b] += intval($result[$a] / $adj);
$result[$a] -= $adj * intval($result[$a] / $adj);
}

return $result;
}

function _date_range_limit_days($base, $result)
{
$days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

_date_range_limit(1, 13, 12, "m", "y", &$base);

$year = $base["y"];
$month = $base["m"];

if (!$result["invert"]) {
while ($result["d"] < 0) {
$month--;
if ($month < 1) {
$month += 12;
$year--;
}

$leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
$days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

$result["d"] += $days;
$result["m"]--;
}
} else {
while ($result["d"] < 0) {
$leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
$days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

$result["d"] += $days;
$result["m"]--;

$month++;
if ($month > 12) {
$month -= 12;
$year++;
}
}
}

return $result;
}

function _date_normalize($base, $result)
{
$result = _date_range_limit(0, 60, 60, "s", "i", $result);
$result = _date_range_limit(0, 60, 60, "i", "h", $result);
$result = _date_range_limit(0, 24, 24, "h", "d", $result);
$result = _date_range_limit(0, 12, 12, "m", "y", $result);

$result = _date_range_limit_days(&$base, &$result);

$result = _date_range_limit(0, 12, 12, "m", "y", $result);

return $result;
}

/**
* Accepts two unix timestamps.
*/
function _date_diff($one, $two)
{
$invert = false;
if ($one > $two) {
list($one, $two) = array($two, $one);
$invert = true;
}

$key = array("y", "m", "d", "h", "i", "s");
$a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
$b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));

$result = array();
$result["y"] = $b["y"] - $a["y"];
$result["m"] = $b["m"] - $a["m"];
$result["d"] = $b["d"] - $a["d"];
$result["h"] = $b["h"] - $a["h"];
$result["i"] = $b["i"] - $a["i"];
$result["s"] = $b["s"] - $a["s"];
$result["invert"] = $invert ? 1 : 0;
$result["days"] = intval(abs(($one - $two)/86400));

if ($invert) {
_date_normalize(&$a, &$result);
} else {
_date_normalize(&$b, &$result);
}

return $result;
}

$date = "1986-11-10 19:37:22";

print_r(_date_diff(strtotime($date), time()));
print_r(_date_diff(time(), strtotime($date)));

PHP - Count number of days between 2 dates

Please use diff function for get days between two date.

$date1 = new DateTime("25-03-2016");
$date2 = new DateTime("01-04-2016");

echo $diff = $date2->diff($date1)->format("%a");

Laravel 7: Calculate days between two dates with condition

I have tried to inspect exactly what you want and made this answer for you. Hope it's what you are trying to explain

Table: working_days
working_days table example

Controller:

public function insertLeaves(Request $request) {

$leave = new Leave;
$leave->start_date = $request->start_date;
$leave->end_date = $request->end_date;

$start_day = date("D", strtotime($request->start_date));
$end_day = date("D", strtotime($request->end_date));

$start = Carbon::parse($request->start_date);
$end = Carbon::parse($request->end_date);
$total_days = $end->diffInDays($start);

// Gets the working days in comma seperated without the key from the database [Example: Sat, Sun, Mon, Tue, Wed, Thu] in array
$working_days = WorkingDay::where('working_status', 0)
->get(['day'])->map(function($day) {
return $day->day;
})->toArray();

// Gets the holidays in comma seperated dates without the key from the database [Example: 2022-05-26, 2022-05-28] in array
$holidays= Holiday::where('publication_status', 1)->get(['date'])->map(function($date) {
return date('Y-m-d', strtotime($date->date));
})->toArray();

// Get the weekend holidays we get between the start date and end date by the helper function we created
$weekend_holidays = $this->sumHolidays($working_days, $request->start_date , $total_days, 'weekends');

// Get the holidays if have any between the start date and end date by the helper function we created
$monthly_holidays = $this->sumHolidays($holidays, $request->start_date , $total_days, 'holidays');

$total_leaves = $total_days - $weekend_holidays - $monthly_holidays + 1; //need solution here;

if($request->halfday == 1){
$leave->total_days = 0.5;
}
else{
$leave->total_days = $total_leaves;
}
$leave->save();

}

function sumHolidays($days, $start_date, $diff, $type) {
$total_days = 0;
$i = 0;
while ($i <= $diff) {
$tsDate = strtotime($start_date . ' ' .'+ '.$i.' days');
if($type == 'weekends') {
$day = date('D', $tsDate);
if(!in_array($day, $days)) {
$total_days++;
}
} elseif($type == 'holidays') {
$date = date('Y-m-d', $tsDate);
if(in_array($date, $days)) {
$total_days++;
}
}
$i++;
}
return $total_days;
}

Outputs Example:

Start Date = 2022-05-26
End Date = 2022-05-28
Working Days = day = ["Sat","Sun","Mon","Tue","Wed","Thu"]
Holidays = date = ["2022-05-26","2022-05-29"]
Weekend Holidays = 1
Monthly Holidays = 1
Total Days = 4
Total Leaves = 2 //As there is 1 Friday and 1 Holiday at 2022-05-26

How to finding the number of days between two days of the week?

Your task doesn't seem to require date functions at all. A simple lookup array will suffice.

  1. Subtract the starting day's integer value from the ending day's integer.
  2. If the difference would be zero or less, add 7 to always return the correct, positive day count.

Code: (Demo)

function daysUntil($start, $end) {
$lookup = [
'Sunday' => 0,
'Monday' => 1,
'Tuesday' => 2,
'Wednesday' => 3,
'Thursday' => 4,
'Friday' => 5,
'Saturday' => 6
];
$days = $lookup[$end] - $lookup[$start] + ($lookup[$end] <= $lookup[$start] ? 7 : 0);
return "{$days} days from {$start} to {$end}\n";
}

echo daysUntil('Wednesday', 'Saturday'); // Thursday, Friday, Saturday
echo daysUntil('Monday', 'Friday'); // Tuesday, Wednesday, Thursday, Friday
echo daysUntil('Thursday', 'Thursday'); // [assumed next week]
echo daysUntil('Friday', 'Monday'); // Saturday, Sunday, Monday
echo daysUntil('Saturday', 'Sunday'); // Sunday
echo daysUntil('Sunday', 'Saturday'); // Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
echo daysUntil('Sunday', 'Wednesday'); // Monday, Tuesday, Wednesday

Output:

3 days from Wednesday to Saturday
4 days from Monday to Friday
7 days from Thursday to Thursday
3 days from Friday to Monday
1 days from Saturday to Sunday
6 days from Sunday to Saturday
3 days from Sunday to Wednesday

Or you can replace the lookup array with 4 function calls and achieve the same outcome: (Demo)

function daysUntil($start, $end) {
$days = date('w', strtotime($end)) - date('w', strtotime($start));
$days += $days < 1 ? 7 : 0;
return "{$days} days from {$start} to {$end}\n";
}

how to calculate days between two days including start date and end date

If you want to get 2 days for this interval you can just +1 to the result, because none of the combinations of functions will give 2 days.

$date11 = strtotime($date11);
$date22 = strtotime($date22);
$diff = $date22 - $date11;
$diff_in_days = floor($diff/(60*60*24)) + 1;

Example



Related Topics



Leave a reply



Submit