OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ある日付から営業日をひいた日付の計算

  • すぐに回答を!
  • 質問No.238020
  • 閲覧数1447
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 54% (27/50)

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

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

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

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

よろしくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル12

ベストアンサー率 75% (398/526)

質問文にある変数、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 に足せば、土日を含めて何日前かが求まります。
お礼コメント
nak205

お礼率 54% (27/50)

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

考え方を読むと、ごもっとも、かつシンプル。
ほんとにありがとうございます
いただきます。
投稿日時 - 2002-03-22 01:17:33
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル11

ベストアンサー率 48% (102/210)

演習問題のつもりで挑戦した初心者回答の失礼をご容赦ください。 実行未確認の「力ずく」ですが・・・ $theday = timelocal(0, 0, 0, dd, mm-1, yyyy); #日付 x のシリアル秒 $i = 0; #経過営業日を0からスタート while ($i < $n) { ...続きを読む
演習問題のつもりで挑戦した初心者回答の失礼をご容赦ください。
実行未確認の「力ずく」ですが・・・

$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 に達した日付を得る
お礼コメント
nak205

お礼率 54% (27/50)

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

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

日付の計算ってほんとややこしいですよね。
投稿日時 - 2002-03-20 02:36:28


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ