プロが教えるわが家の防犯対策術!

入力された日時が定休日であるかを判定するルーチンを考えています。
毎週水曜定休だけであれば曜日判定だけですむのですが、定休日が「第2第3水曜日」という場合、どういった処理をすればよいでしょうか?

当月の定休日データを毎月「5/10/15」のように数値データとし更新してやれば、当月に関してはOKですが、来月の日時を入力された場合これでは営業日であっても定休日と判定してしまいます。

A 回答 (6件)

#1です。

判定ルーチンのコード例です。
-----------------------------------
# 第2,3水曜日判定ルーチン
use Time::Local;
sub hantei
{
# 入力パラメータは P1,P2,P3
# P1:年(2000~)
# P2:月(1~12)
# P3:日(1~31)
my $nen = shift(@_);
my $tuki = shift(@_);
my $hi = shift(@_);
my $mday = $hi;
my $mon = $tuki - 1;
my $year = $nen - 1900;
# 曜日を求める為に timelocal->locatimeの変換を行う
my $ltime=timelocal(0,0,0,$mday,$mon,$year);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
= localtime($ltime);
# $wday が曜日(0~6=>日~土)(従って水曜日は$wday=3)
#水曜日でないなら
if ($wday != 3){
return 0;
}
#水曜日なら
# 1-7は第1週,8-13は第2週,14-21は第3週の水曜日になる
# $noが求める週
my $no = int(($hi-1)/7) + 1 ;
# 第2週又は第3週ならOK
if ($no == 2 || $no == 3){
return 1;
}else{
return 0;
}
}

my $nen= 2007;
for (my $tuki = 1; $tuki < 13; $tuki++){
for (my $hi = 1; $hi<32; $hi++){
my $ret = &hantei($nen,$tuki,$hi);
if ($ret == 1){
printf("定休日です %04d/%02d/%02d\n",$nen,$tuki,$hi);
}
}
}
exit(0);
-----------------------------
sub hanteiが判定ルーチンです。第2、第3の水曜日なら1が返ります。
以外は0が返ります。
2007年の第2、第3の水曜日を求めています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
エディタでコードを書き出し各行をおっているところです。
皆さんからのご回答と合わせずいぶんと光が見えてきました。

ただ余計なことを思いついてしまい・・・。
それは、表題の「第2、第3の水曜日」チェックが完了しても、店舗によっては当月の定休日が「第2、第3の水曜日」であっても、翌月は「水曜日のみ」となったり、はたまた年末は「無休」だったりという定休日の変動が考えられ、結局は入力させる日時の期間(来月までなど)を制限するとともに、定休日の設定もそれにあわせて定期的に設定更新してやらなければならないのか・・・と。ううぅむぅ・・・。

お礼日時:2007/03/20 22:41

> 「+=」って?というところでつまづいています。



「d += a」は,「d = d + a」のことです.
Perl にもある二項代入演算子ですよ.
http://www.kent-web.com/perl/chap2.html
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2007/03/20 23:02

●その月のn回目のw曜日の日付を求める方法



Perl は最近使ってなくて忘れかけているのでC風に書きます.

曜日番号を0(日曜)~6(土曜) とする.
その月の1日の曜日番号をw1とする.

その月のn回目のw曜日がd日であるとすると,
n,wからdを求めるには,

// d ← (最初のw曜日の日付)-1
d = w - w1;
if(d < 0) d += 7;

// d ← n回目のw曜日の日付
d += 7 * (n - 1) + 1;
    • good
    • 0
この回答へのお礼

ありがとうございます。
カレンダーとメモを手元におきチェック中なのですが、「+=」って?というところでつまづいています。

お礼日時:2007/03/20 22:25

8日から21日までにある水曜日。

    • good
    • 0
この回答へのお礼

ありがとうございます。
ご返答を確認したばかりで、ご回答内容をまだ理解できていません。少し時間をとれば「おーなるほどー!」となるのかもしれません。関連ページの内容とあわせ再考してみます。

お礼日時:2007/03/20 19:54

過去に似たような質問発見しました。


http://okwave.jp/qa2321844.html

お勧めは Date::Calcなんだけど
Install 出来ないと使えないから その時は
Date::Pcalc(Pure Perl) を使うといいかも。

日付の計算は、好みだから人によって
やりかたは違っていいと思う。
    • good
    • 0
この回答へのお礼

ありがとうございます。
既出質問の検索が足りませんでした。教えて頂いたページをよく読んでみます。

お礼日時:2007/03/20 19:45

以下のような判定ルーチンを作成すれば良いでしょう。


1.入力年、月、日から曜日を算出。
2.曜日が水曜日でないなら、定休日でない。
3.曜日が水曜日なら、第2又は第3の水曜日なら定休日とし、
それ以外は、定休日でないとする。
    • good
    • 0
この回答へのお礼

ありがとうございます。
もっと複雑かつ膨大なコードになってしまうかと思っていたのですが、さきの関連ページとあわせ簡潔にできそうなので安心しました。

お礼日時:2007/03/20 19:50

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