• ベストアンサー

定休日の判定:第2第3水曜日を判定するには?

入力された日時が定休日であるかを判定するルーチンを考えています。 毎週水曜定休だけであれば曜日判定だけですむのですが、定休日が「第2第3水曜日」という場合、どういった処理をすればよいでしょうか? 当月の定休日データを毎月「5/10/15」のように数値データとし更新してやれば、当月に関してはOKですが、来月の日時を入力された場合これでは営業日であっても定休日と判定してしまいます。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

#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の水曜日を求めています。

perlerz10
質問者

お礼

ありがとうございます。 エディタでコードを書き出し各行をおっているところです。 皆さんからのご回答と合わせずいぶんと光が見えてきました。 ただ余計なことを思いついてしまい・・・。 それは、表題の「第2、第3の水曜日」チェックが完了しても、店舗によっては当月の定休日が「第2、第3の水曜日」であっても、翌月は「水曜日のみ」となったり、はたまた年末は「無休」だったりという定休日の変動が考えられ、結局は入力させる日時の期間(来月までなど)を制限するとともに、定休日の設定もそれにあわせて定期的に設定更新してやらなければならないのか・・・と。ううぅむぅ・・・。

その他の回答 (5)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.6

> 「+=」って?というところでつまづいています。 「d += a」は,「d = d + a」のことです. Perl にもある二項代入演算子ですよ. http://www.kent-web.com/perl/chap2.html

perlerz10
質問者

お礼

ありがとうございます。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.4

●その月の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;

perlerz10
質問者

お礼

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

  • i2719
  • ベストアンサー率35% (11/31)
回答No.3

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

perlerz10
質問者

お礼

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

  • maura
  • ベストアンサー率46% (48/104)
回答No.2

過去に似たような質問発見しました。 http://okwave.jp/qa2321844.html お勧めは Date::Calcなんだけど Install 出来ないと使えないから その時は Date::Pcalc(Pure Perl) を使うといいかも。 日付の計算は、好みだから人によって やりかたは違っていいと思う。

perlerz10
質問者

お礼

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

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

以下のような判定ルーチンを作成すれば良いでしょう。 1.入力年、月、日から曜日を算出。 2.曜日が水曜日でないなら、定休日でない。 3.曜日が水曜日なら、第2又は第3の水曜日なら定休日とし、 それ以外は、定休日でないとする。

perlerz10
質問者

お礼

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

関連するQ&A