Difference between two dates in php using Leap Year - php

Hey I am trying to get total months from two dates in php. I have searched about leap year calculations between two dates everywhere on internet but did not find the answer.
If my input is "2019-01-01" to "2019-03-31" then the result i expected is 3 months but result i get is 2 month.
Following is my code .
$date1 = strtotime("2019-01-01");
$date2 = strtotime("2019-02-28");
$diff = abs($date2 - $date1);
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24)
/ (30*60*60*24));
printf("%d months",$months);
where am i going wrong

I Understand Your Problem..
Actually the result you are getting is correct,because day ends at night 12pm and you are checking at day time.So until day ends you cant get complete month.If You add one day and check you will get correctly 3 Months
Below I Made Some Changes to Your Code..
$new_date = date('Y-m-d', strtotime('2019-02-28' . ' +1 day'));
$date1 = strtotime("2019-01-01");
$date2 = strtotime($new_date);
$diff = abs($date2 - $date1);
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24)
/ (30*60*60*24));
printf("%d months",$months);
You can Also Get it by Mysql querying to server
SELECT TIMESTAMPDIFF(MONTH, '2019-01-01', (SELECT DATE_ADD('2019-02-28', INTERVAL 1 DAY))) as month
You can Try it.Hope it Helps.

Your math calculates the number of months between the two dates, exclusive of the ending month.
Add 1 to the total, like so.
$months = (floor(($diff - $years * 365*60*60*24)
/ (30*60*60*24))) +1;

You can try the following:
$date1 = "2019-01-01";
$date2 = "2019-02-28";
$timestamp1 = strtotime($date1);
$timestamp2 = strtotime($date2);
$year1 = date('Y', $timestamp1);
$year2 = date('Y', $timestamp2);
$month1 = date('m', $timestamp1);
$month2 = date('m', $timestamp2);
$diff = (($year2 - $year1) * 12) + ($month2 - $month1);
printf("%d months",$diff);
Try it here: http://sandbox.onlinephpfunctions.com/code/496a08612489977e9e23e8ef3ea07ba991bc5e23

You have to add extra month in your $month variable
$date1 = strtotime("2019-01-01");
$date2 = strtotime("2019-03-31");
$diff = abs($date2 - $date1);
$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24)
/ (30*60*60*24)) +1 ;
printf("%d months",$months); //Output : give add one extra
OR
$date1 = date_create('2019-01-01');
$date2 date_create('2019-03-31');
$interval= date_diff($date1, $date1);
echo $interval->format('%m months');

Related

How to include last day when using date_diff?

From Apr 13 to May 12, including the last day, the day difference would be 30 days.
But if I use date_diff, I get only 29 days. How do I include the last day? Do I simply add one more day or is there a more elegant solution?
yes you need to include at the last day like you provided link of 30 day because in php date_diff no issue , please again check your reference link there is also option like include end date in calculation (1 day is added)
PHP date_diff not include last day in calculation default so you need to specify it manual
php date_diff no issue because I have added belo four sample to also calculate date different
note: in below example also need to add one more day if need
#1 example
$date1 = date_create('2022-04-13');
$date2 = date_create('2022-05-12');
$dateDifference = date_diff($date1, $date2)->format('%y years, %m months and %d days');
echo $dateDifference;
#2 example
$date1 = date_create('2022-04-13');
$date2 = date_create('2022-05-12');
$diff=date_diff($date1,$date2);
$months = $diff->format("%m months");
$years = $diff->format("%y years");
$days = $diff->format("%d days");
echo $years .' '.$months.' '.$days;
#3 example
$date1 = date_create('2022-04-13');
$date2 = date_create('2022-05-12');
$diff1 = date_diff($date1,$date2);
print_r($diff1);
#4 example
$date1 = '2022-04-13';
$date2 = '2022-05-12';
$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);

PHP Date Difference with Custom Format

I'm facing some problem while calculating the difference between two dates because of Date Format, please help me to fix this issue.
Date 1 - (Format: d/m/Y)
date_default_timezone_set("Asia/Kolkata");
$date1 = date('d/m/Y');
//Output - 20/05/2020
Date 2 - (Format: d/m/Y)
$date2 - 01/27/2020
My Code -
$diff = abs($date2 - $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));
// Print the result
printf("%d years, %d months, %d days", $years, $months, $days);
You don't have to calculate days, month etc manually. There is already DateTime Class available in PHP which you can leverage.
$date1 = DateTime::createFromFormat('d/m/Y', '20/05/2020'); // Use $date1 = new DateTime('NOW'); For Current Time
$date2 = DateTime::createFromFormat('d/m/Y', '25/05/2020');
$interval = $date1->diff($date2);
printf("%d years, %d months, %d days", $interval->y, $interval->m, $interval->d);
Official PHP Documentation: PHP DateTime Class
First you shoud use date format(Format: Y/m/d) and second use strtotime to convert date to seconds because abs function working with numeric values. try following code :
date_default_timezone_set("Asia/Kolkata");
$date1 = strtotime(date('Y/m/d'));
$date2 = strtotime('2020/05/27');
$diff = abs($date2 - $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));
// Print the result
printf("%d years, %d months, %d days", $years, $months, $days);
Output :
0 years, 0 months, 7 days

Calculate between two day and calculate a fine

$date2 = $row['returnbefore'];
$date1 = date('Y/m/d');
$diff = abs(strtotime($date1) - strtotime($date2));
$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));
$final = ($days * 10) ;
echo $final;
i want to do a library system when user return book will check the return date between current date and calculate a fine to user which multiply day by 10 .
what step i left ? and i wan set the current time is my computer time so i can test it
This is a fairly simple problem to accomplish using DateTime and DateInterval.
$now = new DateTime();
$dueDate = new DateTime($row['returnbefore']);
$lateInterval = $now - $dueDate;
$daysLate = $lateInterval->format('d');
$fine = $daysLate > 0 ? intval(floor($daysLate)) * 10 : 0; // This means that you are not charged for a late day until the end of the day

how to get a difference in dates, when the dates is passed through post variable to another page and echo the difference in php

I tried with the below code to find the difference between two dates which is passed through post variable and print, but failed.
$fromdate=$_POST['from_date'];
$todate=$_POST['to_date'];
$date1 = new DateTime($fromdate); //inclusive
$date2 = new DateTime($todate); //exclusive
$diff = $date2->diff($date1);
echo $diff;
Something like this should work for you:
<?php
$_POST['from_date'] = "2014-10-01";
$_POST['to_date'] = "2014-11-02";
$fromdate = $_POST['from_date'];
$todate = $_POST['to_date'];
$diff = abs(strtotime($fromdate) - strtotime($todate));
$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);
?>
Output:
0 years, 1 months, 2 days

convert year or month into days, PHP

So I have used this method to get the difference between 2 dates.
$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));
Now, lets say that I want to convert the years and months into days. How do I do that?
Using DateTime this is a piece of cake:
$date1 = new DateTime($date1);
$date2 = new DateTime($date2);
$diff = $date1->diff($date2, true);
echo $diff->format('%a') . ' days';
$currentDate = date("d-m-Y");
$date1 = date_create("".$joining_date."");
$date2 = date_create("".$currentDate."");
$diff12 = date_diff($date2, $date1);
$hub_days = $diff12->days;
$months = $diff12->m;
$years = $diff12->y;

Categories