Calculate days since a date

By X-FILE on Sep 04, 2004

A function that will calculate total days from a date. Take a look at getdate() function to understand better.

<?PHP 
$result=""; 
$second=1; 
$minute=$second*60; 
$hour=$minute*60; 
$day=$hour*24; 
$week=$day*7; 

#change the data as you want to be calculated
$date1=01/01/01; 
$date2=01/02/03; 

$timestamp1 = strtotime($date1); 
$timestamp2 = strtotime($date2); 

$diffrence = $timestamp2-$timestamp1; 

$weeks=round((((($diffrence/$minute)/$hour)/$day)/$week)); 
$r_days=$diffrence-($weeks*$week*$day*$hour*$minute*$second); 
$days=round(((($r_days/$minute)/$hour)/$day)); 
$r_hours=$r_days-($days*$day*$hour*$minute*$second); 
$hours=round((($r_hours/$minute)/$hour)); 
$r_minutes=$r_hours-($hours*$hour*$minute*$second); 
$minutes=round($r_minutes/$minute); 
$seconds=$r_minutes-($minutes*$minute*$second); 

$result="it has been $weeks weeks, $days days, $hours $hours, $minutes minutes and $seconds seconds since $date1"; 
?> 

Comments

Sign in to comment.
Hawkee   -  Mar 02, 2012

After seeing a few solutions here I thought I'd post mine: http://www.hawkee.com/snippet/9368/

 Respond  
fjl3   -  Mar 02, 2012

Jeffrey,

It amazes me that you would post such a lofty response, tearing the original poster apart, and yet you your self have posted a script that is complete rubbish.

UNIX Timestamp is only available for dates since 1970, so in the grand scheme of things it is very limited. If you want an accurate way of calculating the number of days since a date, you need to take a different approach.

This function will allow you to accurately get the number of days going back as far as the AD calendar to 1/1/1.

function daysSinceDate($startDate, $endDate) {
//Split Dates Into Parts
list($startMonth, $startDay, $startYear) = split("/", $startDate);
list($endMonth, $endDay, $endYear) = split("/", $endDate);

//Get First & Last Full Years
$firstYear = $startYear + 1;
$lastYear = $endYear - 1;

//Calculate Number of Days in the Full Years
$years = $lastYear - $firstYear;
$yearDays = 0;
for($i=$firstYear; $i<$endYear; $i++) {
    if($i>1753) {
        $isLeap = (date('L', strtotime("01-01-$i")) ? 'yes' : 'no');
    } else {
        $isLeap = "no";
    }

    if($isLeap=="yes") {
        $yearDays = $yearDays + 366;
    } else {
        $yearDays = $yearDays + 365;
    }
}

//Calculate Number of Days in Year of Start Date
$startYearDays = 0;
for($i=12; $i>=$startMonth; $i--) {
    if($i==$startMonth) {
        if($i==12) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        } else if($i==11) {
            $startYearDays = $startYearDays + (30 - ($startDay - 1));
        } else if($i==10) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        } else if($i==9) {
            $startYearDays = $startYearDays + (30 - ($startDay - 1));
        } else if($i==8) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        } else if($i==7) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        } else if($i==6) {
            $startYearDays = $startYearDays + (30 - ($startDay - 1));
        } else if($i==5) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        } else if($i==4) {
            $startYearDays = $startYearDays + (30 - ($startDay - 1));
        } else if($i==3) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        } else if($i==2) {
            if($startYear>1753) {
                if((date('L', strtotime("01-01-$startYear")) ? 'yes' : 'no')=="yes") {
                    $startYearDays = $startYearDays + (29 - ($startDay - 1));
                } else {
                    $startYearDays = $startYearDays + (28 - ($startDay - 1));
                }
            } else {
                $startYearDays = $startYearDays + (28 - ($startDay - 1));
            }
        } else if($i==1) {
            $startYearDays = $startYearDays + (31 - ($startDay - 1));
        }
    } else {
        if($i==12) {
            $startYearDays = $startYearDays + 31;
        } else if($i==11) {
            $startYearDays = $startYearDays + 30;
        } else if($i==10) {
            $startYearDays = $startYearDays + 31;
        } else if($i==9) {
            $startYearDays = $startYearDays + 30;
        } else if($i==8) {
            $startYearDays = $startYearDays + 31;
        } else if($i==7) {
            $startYearDays = $startYearDays + 31;
        } else if($i==6) {
            $startYearDays = $startYearDays + 30;
        } else if($i==5) {
            $startYearDays = $startYearDays + 31;
        } else if($i==4) {
            $startYearDays = $startYearDays + 30;
        } else if($i==3) {
            $startYearDays = $startYearDays + 31;
        } else if($i==2) {
            if((date('L', strtotime("01-01-$startYear")) ? 'yes' : 'no')=="yes") {
                $startYearDays = $startYearDays + 29;
            } else {
                $startYearDays = $startYearDays + 28;
            }
        } else if($i==1) {
            $startYearDays = $startYearDays + 31;
        }
    }
}

//Calculate Number of Days in Year of End Date
$endYearDays = 0;
for($i=1; $i<=$endMonth; $i++) {
    if($i==$endMonth) {
        $endYearDays = $endYearDays + $endDay;
    } else {
        if($i==12) {
            $endYearDays = $endYearDays + 31;
        } else if($i==11) {
            $endYearDays = $endYearDays + 30;
        } else if($i==10) {
            $endYearDays = $endYearDays + 31;
        } else if($i==9) {
            $endYearDays = $endYearDays + 30;
        } else if($i==8) {
            $endYearDays = $endYearDays + 31;
        } else if($i==7) {
            $endYearDays = $endYearDays + 31;
        } else if($i==6) {
            $endYearDays = $endYearDays + 30;
        } else if($i==5) {
            $endYearDays = $endYearDays + 31;
        } else if($i==4) {
            $endYearDays = $endYearDays + 30;
        } else if($i==3) {
            $endYearDays = $endYearDays + 31;
        } else if($i==2) {
            if($endYear>1753) {
                if((date('L', strtotime("01-01-$endYear")) ? 'yes' : 'no')=="yes") {
                    $endYearDays = $endYearDays + 29;
                } else {
                    $endYearDays = $endYearDays + 28;
                }
            } else {
                $endYearDays = $endYearDays + 28;
            }
        } else if($i==1) {
            $endYearDays = $endYearDays + 31;
        }
    }
}

$num_days = $endYearDays + $startYearDays + $yearDays;

return number_format($num_days, 0);

}

 Respond  
Jeffrey Gilbert   -  Sep 26, 2011

I'm consistently baffled by how PHP coders can be so awful at basic programming. Not only is this code fundamentally broken on the most basic premise of mathematics, but it's not even remotely close to reusable even if it were. Code snippets like this always make me wish I weren't a PHP developer so I could avoid this well deserved stereotype.

Please test your code to make sure it works before: pushing to production, sharing with others as working code, infecting a project with it, etc...

Here's a working snippet that is far less useless(if this comment board will let me post such a thing):

Test:

Array
(
[major] => Array
(
[weeks] => 2
[days] => 16
[hours] => 394
[minutes] => 23646
[seconds] => 1418788
)

[minor] => Array
    (
        [days] => 2
        [hours] => 10
        [minutes] => 6
        [seconds] => 28
    )

)
Current date: 2011-09-26 20:06:28
It's been 2 weeks and 2 days since 2011-09-10 10:00:00
It's been 16 days and 10 hours since 2011-09-10 10:00:00
It's been 394 hours and 6 minutes since 2011-09-10 10:00:00
It's been 23,646 minutes and 28 seconds since 2011-09-10 10:00:00

Code:
define('SECOND',1);
define('MINUTE',SECOND60);
define('HOUR',MINUTE
60);
define('DAY',HOUR24);
define('WEEK',DAY
7);

public static function returnFullDatetimeArraySinceDatetime($start_datetime,$end_datetime){
    $t1 = strtotime($start_datetime);
    $t2 = strtotime($end_datetime);
    if($t1 > $t2){
        $diffrence = $t1 - $t2;
    } else {
        $diffrence = $t2 - $t1;
    }

    $results['major'] = array(); // whole number representing larger number in date time relationship
    $results['minor'] = array(); // time elapsed not yet constituting an iteration in the major number

    $results['major']['weeks'] = floor($diffrence/WEEK);
    $results['major']['days'] = floor($diffrence/DAY);
    $results['major']['hours'] = floor($diffrence/HOUR);
    $results['major']['minutes'] = floor($diffrence/MINUTE);
    $results['major']['seconds'] = floor($diffrence/SECOND);

    // Logic:
    // Step 1: Take the major result and transform it into raw seconds (it will be less the number of seconds of the difference)
    //  ex: $result = ($results['major']['weeks']*WEEK)
    // Step 2: Subtract smaller number (the result) from the difference (total time)
    //  ex: $minor_result = $difference - $result
    // Step 3: Take the resulting time in seconds and convert it to the minor format
    //  ex: floor($minor_result/DAY)

    $results['minor']['days'] = floor( (($diffrence - ($results['major']['weeks']*WEEK)) / DAY) );
    $results['minor']['hours'] = floor( (($diffrence - ($results['major']['days']*DAY)) / HOUR) );
    $results['minor']['minutes'] = floor( (($diffrence - ($results['major']['hours']*HOUR)) / MINUTE) );
    $results['minor']['seconds'] = floor( (($diffrence - ($results['major']['minutes']*MINUTE)) / SECOND) );

    return $results; 
}
 Respond  
MasterWiki   -  Oct 03, 2009

just a noob here...what is the trigger? how do I activate? thanks

 Respond  
Hawkee   -  Apr 24, 2005

I found another example of this on codewalkers, http://codewalkers.com/archives/sqlhelp/869.html

 Respond  
X-FILE   -  Sep 04, 2004

I forgot to mention , you can use strtotime() to parse any English textual datetime description into a Unix timestamp

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.