note 40193 deleted from function.date by kennyt
| From: | kennyt@php.net | Date: | Sun, 18 Jul 2004 17:24:32 +0000 |
| Subject: | note 40193 deleted from function.date by kennyt | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-73506@lists.php.net to get a copy of this message | ||
Note Submitter: mcrackan
----
Ok, that'll teach me to post a 'solution' before I test it. Here's the real and
tested solution to 'find X number of weekdays starting from day Y'. By the way, I created
this for an application that needs to calculate the time left between a starting date and a due
date, so that's why everything is expressed like 'X days left.' Again: My version
calculates in seconds (unixtime) but if you need to use whole days, it shouldn't be hard to
tweak. Here's the verbose version:
<?
// $startunix: starting point
// $daysltr: number of weekdays (m-f) to count ahead
function weekdays_left($startunix, $daysltr) {
// seconds per day
$spd = 86400;
// numeric day of week
$numdow = date("w", $startunix);
// numeric days left in week 1
$wk1dayslft = 5 - $numdow;
// if days go beyond week 1, continue
// else: days later = calender days left
if($daysltr - $wk1dayslft > 0)
{
// days later after wk 1
$leftafterwk1 = $daysltr - $wk1dayslft;
// full weeks left
$fullwkslft = floor($leftafterwk1 / 5);
// extra days left for final week
$xdayslft = $leftafterwk1 % 5;
// everything beyond here will need 1st weekend added
// unless you end on a friday (5 % 5 = 0 instead of 5 like is needed)
if($xdayslft > 0)
{ $firstwkend = 2; }
else
{ $firstwkend = 0; }
// if no full weeks, add 1st 2 partial weeks
// else: calender days left = (week 1 days + (num_full_weeks x 7) + final week days)
if($fullwkslft == 0)
{ $caldayslft = $wk1dayslft + $xdayslft + $firstwkend; }
else
{ $caldayslft = $wk1dayslft + $firstwkend + ($fullwkslft * 7) + $xdayslft; }
}
else
{ $caldayslft = $daysltr; }
// seconds left
$secslft = $spd * $caldayslft;
// end
$endunix = $startunix + $secslft;
return $endunix;
}
?>