電子書籍の厳選無料作品が豊富!

どなたか、任意の日付xから、n営業日前の日付yを簡単に求めるスクリプトご存知じゃないですか?

モジュールでも結構です。
Time:Localもつかって結構です。

休日は土・日で、祭日は無視して結構です。
アルゴリズムだけでも結構です。

金曜日から5営業日前だったら金曜ですが、3営業日前だと火曜日ですよね。
また数十日前となると、7で割って、それに2掛けて日数を足してそれを金曜日の日付からひいて。。。。と悩んでると、片頭痛が再発しそうです。

よろしくお願いします。

A 回答 (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 に足せば、土日を含めて何日前かが求まります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
すごいです。

考え方を読むと、ごもっとも、かつシンプル。
ほんとにありがとうございます
いただきます。

お礼日時:2002/03/22 01:17

演習問題のつもりで挑戦した初心者回答の失礼をご容赦ください。


実行未確認の「力ずく」ですが・・・

$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 に達した日付を得る
    • good
    • 0
この回答へのお礼

早速ありがとうございます。

そうなんですよね。
ループの度にlocaltimeを呼び出すのがヤで最後の手段にとは思ってるんですが、案外他に手は無いのかも知れないですね。

日付の計算ってほんとややこしいですよね。

お礼日時:2002/03/20 02:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!