Misier
Misier

Reputation: 1533

Get interval seconds between two datetime in PHP?

2009-10-05 18:11:08

2009-10-05 18:07:13

This should generate 235,how to do it ?

Upvotes: 109

Views: 140013

Answers (10)

designcise
designcise

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

Naseem
Naseem

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

lfjeff
lfjeff

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

Amedeo Petrella
Amedeo Petrella

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

Paul Dixon
Paul Dixon

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

Arfon
Arfon

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

MilkThief
MilkThief

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:

  • 0 seconds if diff is applied to time gaps < 1 month
  • 0 to 3 days if diff is applied to time gaps > 1 month
  • 0 to 14 days if diff is applied to time gaps > 1 year

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

jonathancardoso
jonathancardoso

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

Andrew
Andrew

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

jcoder
jcoder

Reputation: 30055

strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")

Upvotes: 3

Related Questions