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.
Related
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
)
I am trying to get difference in hours between two dates using PHP DateTime object but the result is not accurate. One date is the current date time and second is the event date which comes from database. I don't understand on what logic the hours difference is calculated.
Here's my code:
<?php
$date1 = new DateTime();
$date2 = new DateTime("2018-09-04 20:37:06");
$interval = $date2->diff($date1);
echo "<pre>";
print_r($interval);
echo "</pre>";
echo $interval->format('%a Day and %h hours');
?>
Output:
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 3
[i] => 14
[s] => 13
[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
)
0 Day and 3 hours
The script is executed at 08:53 PM (India) i.e. 20:53:00 but the difference is 3 hours. Don't know why?
For Indian time this should help :-
<?php
$timezone = new DateTimeZone('Asia/Kolkata');
$date1 = new DateTime('now', $timezone);
$date2 = new DateTime("2018-09-04 20:37:06", $timezone);
$interval = $date2->diff($date1);
echo "<pre>";
print_r($interval);
echo "</pre>";
echo $interval->format('%a Day and %h hours');
?>
Just use the DateTimeZone('Zone') and it should set the new date to the zone where you are.
I am trying to calculate time different between 3 different dates
1. Start date
2. End date
3 current date
I have been researching on how to calculation but couldn't find any exact example.
Any assistance in resolving this would be appreciated.
function getweekSartEndDate($date){
$cur_date = strtotime($date); // Change to whatever date you need
// Get the day of the week: Sunday = 0 to Saturday = 6
$dotw = date('w', $cur_date);
if($dotw>1){
$pre_monday = $cur_date-(($dotw-1)*24*60*60);
$next_sunday = $cur_date+((7-$dotw)*24*60*60);
}
else if($dotw==1){
$pre_monday = $cur_date;
$next_sunday = $cur_date+((7-$dotw)*24*60*60);
}
else if($dotw==0){
$pre_monday =$cur_date - (6*24*60*60);;
$next_sunday = $cur_date;
}
$date_array = array();
$date_array['weekStart'] = $pre_monday;
$date_array['weekEnd'] = $next_sunday;
return $date_array;
}
The above is the example code i got so far, and i was able to get the start and end dates of a week as seen below:
$weekStart = date('Y-m-d H:i:s', $weekInfo['weekStart']);
$weekEnd = date('Y-m-d H:i:s', $weekInfo['weekEnd']);
My challenges is how to get the time difference in 'Y-m-d H:i:s' date format from the current time.
You can use
$currentDate = date('Y-m-d H:i:s');
$currentDate = new DateTime($currentDate);
$leaveDate = new DateTime($leaveFrom);
$difference = $currentDate->diff($leaveDate);
You will get result as follow
DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 0 [i] => 0 [s] => 0 [f] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => 0 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 )
You need basic knowledge on how to do number comparisons in PHP.
Convert your date strings to a UNIX-timestamp with strtotime
$d = strtotime("19/10/2016 14:48:21");
// 1519646232
When the dates are in UNIX-timestamp format, it's easy to compare them with any regular comparison operators as int numbers.
EDIT
Difference in seconds:
$diffBetweenStartAndNow = strtotime( $date_array['weekStart'] ) - time();
$diffBetweenEndAndNow = strtotime( $date_array['weekEnd'] ) - time();
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)
I am trying to find a way to determine whether a timespan is partially or fully within another timespan. For example:
I have time entries of:
Monday 18:30:00 to Tuesday 05:00:00,
Monday 23:00:00 to Tuesday 05:00:00,
Monday 20:00:00 to Tuesday 08:00:00,
Monday 00:00:00 to Tuesday 08:00:00,
and need to find, for each one, how much of the time is within a timespan of 22:00:00 to 06:00:00. The output would need to be:
07:00:00,
06:00:00,
08:00:00,
06:00:00.
What you're looking for is DateTime::diff which returns an instance of an DateInterval
Here a little example:
$d1 = new DateTime("Monday 18:30:00");
$d2 = new DateTime("Tuesday 05:00:00");
$limit1 = new DateTime("Monday 22:00:00");
$limit2 = new DateTime("Tuesday 06:00:00");
$within1 = $d1->getTimestamp() < $limit1->getTimestamp() ? $limit1 : $d1;
$within2 = $d2->getTimestamp() < $limit2->getTimestamp() ? $d2 : $limit2;
$interval = $within1->diff($within2);
print_r($interval);
print_r($interval);
outputs:
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 0
[h] => 7
[i] => 0
[s] => 0
[invert] => 0
[days] => 0
)
You can either read this attributes directly or you can use the DateInterval::format()