date_default_timezone_set('PRC');
/**
* Erhalten Sie das Datum, nachdem eine bestimmte Anzahl von Tagen seit einem bestimmten Datum vergangen ist,
* schließen Sie Samstage, Sonntage und Feiertage aus
* @param $start Startdatum
* @param $offset Anzahl von Tage vergangen
* @param $Exception Ausnahmefeiertage
* @param $allow Zulässige Daten (reservierte Parameter)
* @return
* Beispiele: Eingabe (2010-06-25,5,'' ),get2010-07-02
*/
function getEndDay( $start='now', $offset=0, $Exception='', $allow='' ){
//Berechnen Sie zuerst die Ergebnisse, ohne Samstage, Sonntage und Feiertage auszuschließen
$starttime = strtotime($start);
$endtime = $starttime + $offset * 24 * 3600;
$ end = date('Y-m-d', $endtime);
// Dann den durch Samstag und Sonntag verursachten Versatz berechnen
$weekday = date('N', $starttime);//Wochentagswert abrufen : 1-7
$remain = $offset % 7;
$newoffset = 2 * ($offset - $remain) / 7;//Jede Woche müssen zwei Tage neu berechnet werden
if( $remain > 0 ){//Wochentag aufrunden
$tmp = $weekday + $remain;
if( $tmp >= 7 ){
$newoffset += 2;
}else if ( $tmp == 6 ){
$newoffset += 1; > $newoffset -= 1;
}else if( $weekday == 7 ){
$newoffset -= 2;
}
}
}
if( is_array($Exception) ){//Mehrere Feiertage
foreach ($Exception as $day){
$tmp_time = strtotime($day);
if ($ TMP_TIME & GT; Wochenenden
& ){
$ woekday_t = date ('n', $ tmp_time);
if ($ wochentag_t & lt; = 5) {
🎜>}
// Gemäß der Offset -Anzahl der Tage die äquivalente Operation
if($newoffset > 0){
#echo "[{$start} -> {$offset}] = [{$end} -> {$newoffset}]". />n";
return getEndDay($end,$newoffset,$Exception,$allow);
}else{
return $end;
}
}
/**
* Violent-Loop-Methode
*/
function getEndDay2( $start='now', $offset=0, $Exception='', $allow= '' ){
$starttime = strtotime($start);
$tmptime = $starttime + 24*3600;
while( $offset > 0 ){
$weekday = date('N', $tmptime);
$tmpday = date('Y-m-d', $tmptime);
$bfd = false;//是否节假日
if(is_array($Exception) ). < =5 && !$bfd){//不是周末和节假日
$offset--;
#echo "tmpday={$tmpday}"."
";
}
# 01-02','2010-01-03',
'2010-04-03','2010-04-04','2010-04-05',
'2010-05-01' ,'2010-05-02','2010-05-03',
'2010-06-14','2010-06-15','2010-06-16',
'2010- 22.09.','23.09.2010','24.09.2010',
'01.10.2010','2010-10-02','2010-10-03','2010 -10-04',
'2010-10-05','2010-10-06','2010-10-07',
);
//echo getEndDay(' 2010-08-27',3,'');
//echo getEndDay('2010-06-25',15,'2010-07-07');
$t1 = microtime();
echo getEndDay('2010-05-12',66,$Exception)."
";
$t2 = microtime();echo "use ".($t2-$t1 )." s
";
echo getEndDay2('2010-05-12',66,$Exception)."
";
$t3 = microtime() ;echo "use ".($t3-$t2)." s
";