PHP - Trying to calculate difference between dates get 0 as a result - php

I am trying to calculate the difference between two dates to get difference in days, months and years but as a result I get 0 on all parameters. I am relatively new to this, for some I am making an obvious mistake, but I cannot understand what I am doing wrong. Would anyone be kind enough to clarify this? I appreciate any answers / help, thanks.
Update
After Markus Zeller's answer I modified my code as follows and it worked. I will make further changes to better suit my needs, but the code as it is works fine. It does not provide the total number of days and months, but these are displayed as age (example 1 year, 3 months and 14 days) and not as (example 1 year 15 months and 471 days). In these two examples the dates were start: 04/15/2021 - end: 07/30/2022
Only problem left
Following the examples above, the correct past days would be 15 (or 471), while I get 14 (or 470). Why is there this 1 day error ?
function difference_between_date() {
$data1 = new DateTime(wp_get_current_user()->user_registered); //Registered User Date
$data2 = new DateTime(); //Current Date
$interval = $data1->diff($data2);
$diffInSeconds = $interval->s; //example 45
$diffInMinutes = $interval->i; //example 15
$diffInHours = $interval->h; //example 6
$diffInDays = $interval->d; //example 20
$diffInMonths = $interval->m; //example 4
$diffInYears = $interval->y; //example 2
echo '<div class="today_date">days' . wp_kses_post($diffInDays) . '</div>';
echo '<div class="today_date">months' . wp_kses_post($diffInMonths) . '</div>';
echo '<div class="today_date">years' . wp_kses_post($diffInYears) . '</div>';
} add_shortcode('diff_date', 'difference_between_date');

PHP has very good DateTime functions. Use them for example:
$date1 = new DateTime('2022-07-30 15:00:00');
$date2 = new DateTime('2020-01-29 14:30:00');
$diff = $date2->diff($date1);
print_r($diff);
gives you all the properties you need. In this example 2 years, 6 months, 1 day and 30 mins or 913 days in total.
DateInterval Object
(
[y] => 2
[m] => 6
[d] => 1
[h] => 0
[i] => 30
[s] => 0
[f] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 913
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

Related

Simple date_diff off significantly [duplicate]

This question already has answers here:
How to calculate the difference between two dates using PHP?
(34 answers)
Closed 5 years ago.
I'm trying to use date_diff to compare two dates, but it's not even coming close to the right number. To troubleshoot, I'm doing a simple hard-coded test:
$date1 = date_create("2014-03-20");
$date2 = date_create("2017-11-13");
$diff = date_diff($date1,$date2);
echo $diff->format('%r%d');
This outputs "24" for me -- so it's not even in the ballpark. Any ideas what's going wrong here?
The $diff outcome contains a DateInterval object. It contains the following:
DateInterval Object
(
[y] => 3
[m] => 7
[d] => 24
[h] => 0
[i] => 0
[s] => 0
[f] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 1334
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
By echo'ing $diff->d you'll get the day difference. If you'd like to have the total amount of days. Use $diff->days. Just play around with it.
You are using format codes for dates in PHP, but yet you are having a date interval, that has different format codes.
echo $diff->format('%y-%m-%d');
This will show the correct value.
If you are looking for the total number of days you should use the a format character. See more at php date interval format.
$diff->format('%a');
output:
1334

How to show server run time in laravel?

i want to show date to user from how much days website is running
e.g today : runing from 10 days . next day : running from 11 days
$current = time();
$initial_date = strtotime("2017-11-1"); //You will have to fix this
$datediff = $current - $initial_date;
$num_of_days = floor($datediff / (60 * 60 * 24));
echo "Running from ".$num_of_days." days";
Note: This will not count today.
It's not laravel specific, you can use this in PHP generally:
exec("uptime", $uptimeVar);
echo($uptimeVar[0]);
You can also format it any way you like.
This way helpful to you. first define the web site starting date as a constant as follow:
define('START_DATE', '2017-11-02');
Then you have to put below code in to the place you have to show the date difference:
$date1 = new DateTime(START_DATE);
$date2 = new DateTime(date('Y-m-d'));
$diff = $date1->diff($date2);
print_r($diff); // or $diff->days
echo $diff->days . " day(s)"; // output '6 day(s)'
Output looks like:
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 6
[h] => 0
[i] => 0
[s] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 6
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
6 day(s)

How to calculate time difference between SQL time and PHP time

I have set times in SQL in this format: 2016-01-03 12:13:26.
I would like to calculate the number of hours and minutes (if hours<1) going from NOW() to that particular SQL time.
I've been looking at all the different threads here but I can't seem to grasp how to convert PHP different time formats to SQL's.
This is the code I've been using, but this will only give me back hours up to 12, and minutes also. Don't know how to use it with days.
$now = date("d/m/Y h:i:s");
$commentime = strtotime($SQLTIME);
$timetocomment = $now - $commentime;
For instance, this code will yield "12 hours ago" for data I posted 24 hours ago to SQL.
How can I do it? Thank you.
This is my suggestion to use date() in this format date("Y-m-d h:i:s"). Than you will get the complete difference in an array.
function dateDifference($date_1 ,$date_2)
{
$datetime1 = date_create($date_1);
$datetime2 = date_create($date_2);
$interval = date_diff($datetime1, $datetime2);
return $interval;
}
$now = date("Y-m-d h:i:s");
$sqlTime = "2016-01-03 12:13:26";
$DateDiffArr = dateDifference($now,$sqlTime);
echo "<pre>";
print_r($DateDiffArr);
Result Is:
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 22
[i] => 45
[s] => 55
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 0
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
In resultant array, you can get the all difference as you need like in years, months, days, minutes, seconds etc.

php minus past date from current date and get result in days [duplicate]

This question already has answers here:
How to calculate the difference between two dates using PHP?
(34 answers)
Closed 7 years ago.
Im looking for the less complicated way to do the following:
$joinDate = "2014-05-26"
$date = date('Ymd'); //todays date
$memberFor = $joinDate - $date //This is where I need to get total number of days
Is there a function that can help me with this?
You should be using DateTime Object for these operations
$joinDate = "2014-05-26";
$joinDate_obj = new DateTime($joinDate);
$now = new DateTime();
$interval = $joinDate_obj->diff($now);
$diff = $interval->d ;
echo $diff; //12
The object $interval will have
DateInterval Object (
[y] => 0
[m] => 11
[d] => 12
[h] => 12
[i] => 49
[s] => 4
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 347
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0 [have_special_relative] => 0
)
So you may use for example $interval->days for the difference in days.

PHP get time period by timestamp

How can I get the time period (day, week, month) by a given timestamp? I do not want the date. I want the next time period based on the amount of seconds.
Is there a PHP native function for that?
Example:
$period = getTimeperiod( 15638400 );
My attempt: I could check and count the seconds:
if x <= 60 => min
if x <= 60*60 => hour
if x <= 60*60*24 => day
...
Edit:
Time period means either minute, hour, day, week, ... as stated above... ?! So all I want is the corresponding time period for a timestamp.
Example: (day = 86400 secs) then a timestamp with getTimeperiod( 85000 ) should be "day".
I think you're searching for something like the class DateInterval ...
It is part of PHP since 5.3.0 and has a static function called createFromDateString() where you can set up a DateInterval from a string like "3600 seconds". From this object you then can get the day, month, year and so on.
Take a look at this page:
http://www.php.net/manual/de/dateinterval.createfromdatestring.php
But is this on the right path returning an interval object (period)? Cred to #SimonSimCity for pointing out DateInterval. If you guide me I could improve the answer.
<?php
$timestamp = 15638400;
echo "The timestamp $timestamp is " . date("Y-m-d H:i:s", 15638400) . "<br \>";
echo "<pre>";
print_r (DateInterval::createFromDateString(date("Y \\y\\e\\a\\r\\s m \\m\\o\\n\\t\\h\\s d \\d\\a\\y\\s\\ H \\h\\o\\u\\r\\s i \\m\\i\\n\\u\\t\\e\\s s \\s\\e\\c\\o\\n\\d\\s", 15638400 ) ) );
echo "</pre>"
?>
Outputting
The timestamp 15638400 is 1970-07-01 00:00:00
DateInterval Object
(
[y] => 1970
[m] => 7
[d] => 1
[h] => 0
[i] => 0
[s] => 0
[invert] => 0
[days] => 0
)
I solved it that way:
/*
seconds 0
minutes 1
hours 2
days 3
week 4
month 5
year 6
decade 7
century 8
millenium 9
*/
$arTimes = array(
0 => 1,
1 => 60,
2 => 60*60,
3 => 60*60*24,
4 => 60*60*24*7,
5 => 60*60*24*7*4,
6 => 60*60*24*7*4*12,
7 => 60*60*24*7*4*12*10,
8 => 60*60*24*7*4*12*10*10,
9 => 60*60*24*7*4*12*10*10*10
);
$nDiff = strtotime( $nTo ) - strtotime( $nFrom );
switch( $nDiff )
{
// check difference and time period
case $nDiff <= $arTimes[ 1 ]:
$nGranularity = 0;
break;
...
}

Categories