- ベストアンサー
ある日付から営業日をひいた日付の計算
どなたか、任意の日付xから、n営業日前の日付yを簡単に求めるスクリプトご存知じゃないですか? モジュールでも結構です。 Time:Localもつかって結構です。 休日は土・日で、祭日は無視して結構です。 アルゴリズムだけでも結構です。 金曜日から5営業日前だったら金曜ですが、3営業日前だと火曜日ですよね。 また数十日前となると、7で割って、それに2掛けて日数を足してそれを金曜日の日付からひいて。。。。と悩んでると、片頭痛が再発しそうです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問文にある変数、x, n, y を、それぞれ変数 $x, $n, $y として使用します。 また、$x, $y は、シリアル秒とします。 $w = (localtime($x))[6]; if ($n >= $w) { $s = int(($n - $w) / 5) + 1; $n += $s * 2; } $y = $x - $n * (60*60*24); (多分)これで求まると思います。 ■考え方 ・n 営業日前、というのが、1回も土日をまたがなければ、$x から $n 日分のシリアル秒を引けばOKです。 ・1回でも土日をまたぐのであれば、前週の金曜日まで(営業日で)戻り、そこから(週5日で)何週分あるかを求めます($s)。その週数に土日の日数(2)をかけた値を $n に足せば、土日を含めて何日前かが求まります。
その他の回答 (1)
- loveobo
- ベストアンサー率48% (102/210)
演習問題のつもりで挑戦した初心者回答の失礼をご容赦ください。 実行未確認の「力ずく」ですが・・・ $theday = timelocal(0, 0, 0, dd, mm-1, yyyy); #日付 x のシリアル秒 $i = 0; #経過営業日を0からスタート while ($i < $n) { #経過営業日が n に達したら抜ける $theday = $theday - 24*60*60; #1日前のシリアル秒 $wday = (localtime($theday))[6]; #その曜日を求めて if (($wday != 0) && ($wday != 6)) { #土日でなければ ++$i;} #経過営業日を加算して } #戻る $y = localtime($theday); #経過営業日数が n に達した日付を得る
お礼
早速ありがとうございます。 そうなんですよね。 ループの度にlocaltimeを呼び出すのがヤで最後の手段にとは思ってるんですが、案外他に手は無いのかも知れないですね。 日付の計算ってほんとややこしいですよね。
お礼
ありがとうございます。 すごいです。 考え方を読むと、ごもっとも、かつシンプル。 ほんとにありがとうございます いただきます。