date x
私はそれがn working days
の前にあるようなものを見つける必要がありますdate y
。
のようなものを使用することもできますdate("Y-m-d",$def_date." -5 days");
が、その場合、週末やオフデートは考慮されません。私の就業日が月曜日から土曜日であると仮定しましょう。これをどのように達成できるか考えてみてください。
date x
私はそれがn working days
の前にあるようなものを見つける必要がありますdate y
。
のようなものを使用することもできますdate("Y-m-d",$def_date." -5 days");
が、その場合、週末やオフデートは考慮されません。私の就業日が月曜日から土曜日であると仮定しましょう。これをどのように達成できるか考えてみてください。
これを試して
<?php
function businessdays($begin, $end) {
$rbegin = is_string($begin) ? strtotime(strval($begin)) : $begin;
$rend = is_string($end) ? strtotime(strval($end)) : $end;
if ($rbegin < 0 || $rend < 0)
return 0;
$begin = workday($rbegin, TRUE);
$end = workday($rend, FALSE);
if ($end < $begin) {
$end = $begin;
$begin = $end;
}
$difftime = $end - $begin;
$diffdays = floor($difftime / (24 * 60 * 60)) + 1;
if ($diffdays < 7) {
$abegin = getdate($rbegin);
$aend = getdate($rend);
if ($diffdays == 1 && ($astart['wday'] == 0 || $astart['wday'] == 6) && ($aend['wday'] == 0 || $aend['wday'] == 6))
return 0;
$abegin = getdate($begin);
$aend = getdate($end);
$weekends = ($aend['wday'] < $abegin['wday']) ? 1 : 0;
} else
$weekends = floor($diffdays / 7);
return $diffdays - ($weekends * 2);
}
function workday($date, $begindate = TRUE) {
$adate = getdate($date);
$day = 24 * 60 * 60;
if ($adate['wday'] == 0) // Sunday
$date += $begindate ? $day : -($day * 2);
return $date;
}
$def_date="";//define your date here
$preDay='5 days';//no of previous days
date_sub($date, date_interval_create_from_date_string($preDay));
echo businessdays($date, $def_date); //date prior to another date
?>
PHP.netから変更
助けてくれてありがとう、しかしこの特定の問題を解決するために、私は簡単なコードを書きました:
$sh_padding = 5; //No of working days to count backwards
$temp_sh_padding = 1; //A temporary holder
$end_stamp = strtotime(date("Y-m-d", strtotime($date_format)) . " -1 day"); //The date(timestamp) from which to count backwards
$start_stamp = $end_stamp; //start from same as end day
while($temp_sh_padding<$sh_padding)
{
$sh_day = date('w',$start_stamp);
if($sh_day==0){ //Skip if sunday
}
else
{
$temp_sh_padding++;
}
$start_stamp = strtotime(date("Y-m-d",$start_stamp)." -1 day");
}
$sh_st_dte = date("Y-m-d",$start_stamp); //The required start day
少しグーグルで調べたところ、このページにたどり着きました。このページには、2 つの日付間の稼働日数を計算する関数が含まれています。
その概念をニーズに合わせて調整するのはかなり簡単です。
ただし、問題は、「営業日」が月曜日から金曜日までという概念が普遍的ではないことです。ソフトウェアが社内でしか使用されていない場合は、いくつかの仮定を立ててもかまいませんが、サード パーティによる使用が意図されている場合は、彼らがあなたと同じ週に働くとは想定できません。
さらに、祝日は、年間を通じてさまざまな稼働週から恣意的な日付を削除することにより、作業に大きなスパナを投げます。
これらに対応したい場合、それを行う唯一の賢明な方法は、年間の日付をカレンダー (つまり、大きな配列) に保存し、それらを稼働日または非稼働日として個別にマークすることです。そして、それを行う場合は、週末にも同じメカニズムを使用することをお勧めします.
もちろん、欠点は、これを最新の状態に保つ必要があることです。しかし、週末については、少なくとも、それは些細なことです (事前にカレンダーをループして、週末の日付をマークしますdate('w')==0 or date('w')==6
)。