Skip to content

Instantly share code, notes, and snippets.

@cescgie
Forked from ozh/gist:8169202
Last active September 9, 2015 10:36
Show Gist options
  • Select an option

  • Save cescgie/15e0776820d1372ff8ff to your computer and use it in GitHub Desktop.

Select an option

Save cescgie/15e0776820d1372ff8ff to your computer and use it in GitHub Desktop.

Revisions

  1. @ozh ozh created this gist Dec 29, 2013.
    88 changes: 88 additions & 0 deletions gistfile1.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    <?php

    /**
    * Get human readable time difference between 2 dates
    *
    * Return difference between 2 dates in year, month, hour, minute or second
    * The $precision caps the number of time units used: for instance if
    * $time1 - $time2 = 3 days, 4 hours, 12 minutes, 5 seconds
    * - with precision = 1 : 3 days
    * - with precision = 2 : 3 days, 4 hours
    * - with precision = 3 : 3 days, 4 hours, 12 minutes
    *
    * From: http://www.if-not-true-then-false.com/2010/php-calculate-real-differences-between-two-dates-or-timestamps/
    *
    * @param mixed $time1 a time (string or timestamp)
    * @param mixed $time2 a time (string or timestamp)
    * @param integer $precision Optional precision
    * @return string time difference
    */
    function get_date_diff( $time1, $time2, $precision = 2 ) {
    // If not numeric then convert timestamps
    if( !is_int( $time1 ) ) {
    $time1 = strtotime( $time1 );
    }
    if( !is_int( $time2 ) ) {
    $time2 = strtotime( $time2 );
    }

    // If time1 > time2 then swap the 2 values
    if( $time1 > $time2 ) {
    list( $time1, $time2 ) = array( $time2, $time1 );
    }

    // Set up intervals and diffs arrays
    $intervals = array( 'year', 'month', 'day', 'hour', 'minute', 'second' );
    $diffs = array();

    foreach( $intervals as $interval ) {
    // Create temp time from time1 and interval
    $ttime = strtotime( '+1 ' . $interval, $time1 );
    // Set initial values
    $add = 1;
    $looped = 0;
    // Loop until temp time is smaller than time2
    while ( $time2 >= $ttime ) {
    // Create new temp time from time1 and interval
    $add++;
    $ttime = strtotime( "+" . $add . " " . $interval, $time1 );
    $looped++;
    }

    $time1 = strtotime( "+" . $looped . " " . $interval, $time1 );
    $diffs[ $interval ] = $looped;
    }

    $count = 0;
    $times = array();
    foreach( $diffs as $interval => $value ) {
    // Break if we have needed precission
    if( $count >= $precision ) {
    break;
    }
    // Add value and interval if value is bigger than 0
    if( $value > 0 ) {
    if( $value != 1 ){
    $interval .= "s";
    }
    // Add value and interval to times array
    $times[] = $value . " " . $interval;
    $count++;
    }
    }

    // Return string with times
    return implode( ", ", $times );
    }

    /**
    Usage:
    $t = '2013-12-29T00:43:11+00:00';
    $t2 = '2013-11-24 19:53:04 +0100';
    var_dump( get_date_diff( $t, $t2, 1 ) ); // string '1 month' (length=7)
    var_dump( get_date_diff( $t, $t2, 2 ) ); // string '1 month, 4 days' (length=15)
    var_dump( get_date_diff( $t, $t2, 3 ) ); // string '1 month, 4 days, 5 hours' (length=24)
    */