Reputation: 1533
2009-10-05 18:11:08
2009-10-05 18:07:13
This should generate 235,how to do it ?
Upvotes: 109
Views: 140013
Reputation: 4372
For those worrying about the limitations of using timestamps (i.e. using dates before 1970 and beyond 2038), you can simply calculate the difference in seconds like so:
$start = new DateTime('2009-10-05 18:07:13');
$end = new DateTime('2009-10-05 18:11:08');
$diff = $start->diff($end);
$daysInSecs = $diff->format('%r%a') * 24 * 60 * 60;
$hoursInSecs = $diff->h * 60 * 60;
$minsInSecs = $diff->i * 60;
$seconds = $daysInSecs + $hoursInSecs + $minsInSecs + $diff->s;
echo $seconds; // output: 235
Wrote a blog post for those interested in reading more.
Upvotes: 10
Reputation: 24
$date1 = new DateTime('2009-10-05 18:11:08');
$date2 = new DateTime('2009-10-05 18:07:13');
$interval = $date1->diff($date2);
echo $interval->s + $interval->i * 60 + $interval->h * 3600 + $interval->days * 86400;
Upvotes: 0
Reputation: 2018
I know this is an old question, but I had a similar problem and came up with this solution that should work for almost any date, including those before 1970 or after 2038:
$loDate = new DateTime('1000-01-01');
$hiDate = new DateTime('2525-01-01');
if ($hiDate >= $loDate) {
$diff = $loDate->diff($hiDate);
$seconds = bcmul((string) $diff->days, '86400');
if ($diff->h > 0 || $diff->i > 0 || $diff->s > 0) {
$seconds = bcadd($seconds, (string) ($diff->h * 3600));
$seconds = bcadd($seconds, (string) ($diff->i * 60));
$seconds = bcadd($seconds, (string) $diff->s);
}
}
The DateTime
class is not smart enough to account for calendar changes made in 1752 (when Sept 2, 1752 was followed by Sept 14, 1752), so don't count on this to handle historical dates correctly.
Upvotes: 0
Reputation: 1
The solution proposed by @designcise is wrong when "end date" is before "start date". Here is the corrected calculation
$diff = $start->diff($end);
$daysInSecs = $diff->format('%r%a') * 24 * 60 * 60;
$hoursInSecs = $diff->format('%r%h') * 60 * 60;
$minsInSecs = $diff->format('%r%i') * 60;
$seconds = $daysInSecs + $hoursInSecs + $minsInSecs + $diff->format('%r%s');
Upvotes: 0
Reputation: 301085
You can use strtotime() to do that:
$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
A similar approach is possible with DateTime objects, e.g.
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
Upvotes: 175
Reputation: 69
A simple and exact solution (exemplifying Nilz11's comment):
$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 +
$diff->format("%i")) * 60 + $diff->format("%s");
Upvotes: -1
Reputation: 69
Because of unix epoch limitations, you could have problems compairing dates before 1970 and after 2038. I choose to loose precision (=don't look at the single second) but avoid to pass trough unix epoch conversions (getTimestamp). It depends on what you are doing to do...
In my case, using 365 instead (12*30) and "30" as mean month lenght, reduced the error in an usable output.
function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
$diff = $end->diff($start);
$diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
($diff->s)+ // seconds (no errors)
(60*($diff->i))+ // minutes (no errors)
(60*60*($diff->h))+ // hours (no errors)
(24*60*60*($diff->d))+ // days (no errors)
(30*24*60*60*($diff->m))+ // months (???)
(365*24*60*60*($diff->y)) // years (???)
);
return $diff_sec;
}
Note that the error could be 0, if "mean" quantities are intended for diff. The PHP docs don't speaks about this... In a bad case, error could be:
I prefer to suppose that somebody decided to consider "m" as 30 days and "y" as 365, charging "d" with the difference when "diff" walk trough non-30-days months...
If somebody knows something more about this and can provide official documentation, is welcome!
Upvotes: 6
Reputation: 12766
With DateTime objects, you can do it like this:
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
Upvotes: 197
Reputation: 10033
PHP Date Time reference is helpful for things like this: PHP Date Time Functions
strtotime() is probably the best way.
$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
Upvotes: 10
Reputation: 30055
strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")
Upvotes: 3