お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"休日の判定 / 日・祝・振り替え"





◆説明◆
 指定された日付が、日・祝・あるいは振替休日であるかどうかを判定しま
す。

◆問題点◆
 祝日の場合「春分の日・秋分の日」を始めとして、判定にはいくつかの問
題が生じます。
 例えば、東京オリンピックを記念して設定された「体育の日」や最近では
「海の日」など、ある年になって、今まで祝日でなかった日が祝日として設
定されるような場合があるため、実際問題として1つの関数で永続的に判定
を行うのは不可能となっています。
 そこで、プログラマであればコードレベルからの変更も可能なのですが、
一般ユーザーの方への配布を前提とするようなソフトの場合は、そのユーザ
ーの方が祝日データを書き換え(追加設定)出来るような仕様である方が、結
果的には良いような気がします。

◆注意◆
1: このサンプルでは StringGrid1 に、
     1(日付)  2(祝日名)
 1  01/01  元旦
 2  01/15  成人の日
 3  02/11  建国記念日
 4  03/21  春分の日
 5  04/29  みどりの日
 6  05/03  憲法記念日
    ・     ・
    ・     ・
  ナドといったデータが入力されている、ということを前提としていま
 す。
2: 入力される判定値は「YY/MM/DD」形式であるコトを前提としています。
3: 例えば「01/01 が日曜日であっても 01/02 は振り替え休日とはなら
 ない」のですが、そのテの決まり事には対応しておりません。 (  );
4: なお、2000年問題には完っ璧に対応していません。 (  );;

◆サンプルコード◆
// グローバル宣言
var
   data: String;
   Hol: Boolean;

procedure TForm1.Holiday(Sender: TObject);
var
   Days: String;
   RC, HC: Integer;
   Fin: Boolean;
begin
   Hol := False;
// 1: 指定日が日曜日であるかどうかを判定します===========
   if DayOfWeek(StrToDate(data)) = 1 then Hol := True else
   begin
// 2: 指定日が祝日であるかどうかを判定します============
      // 2-1 指定日の日付から「MM/DD」を取得します
      Days := Copy(data, 4, 5);

      // 2-2 Days が StringGrid1 に入力された日付かどうか
      //    (祝日かどうか)を判定します
      for RC := 1 to StringGrid1.RowCount - 1 do
         if StringGrid1.Cells[1,RC] = Days then Hol := True;

// 3: 指定日が振り替え休日であるかどうかを判定します========
      if Hol = False then
      begin
         // 3-1 指定日の日付から、前日の「MM/DD」を取得し「前日が祝日
         //     である日」が何日連続しているかを取得します
         HC := 1;  // ←これ
         Fin := False;
         while Fin = False do
         begin
            // data の HC 日前を「MM/DD」形式で取得
            Days := Copy(FormatDateTime('yy/mm/dd', // ↓これ
            StrToDateTime(DateToStr((StrToDate(data) - HC)))),
                          4, 5);
            RC := 1;
            while (Days <> StringGrid1.Cells[1,RC]) and
                  (RC <= StringGrid1.RowCount - 1) do
                  inc(RC);

       {}if RC < StringGrid1.RowCount then inc(HC) else Fin := True;
         end;                           // ^^^^^^^これ
         dec(HC);  // これ

         // 振り替えの可能性(前日が祝日)があれば
         if HC > 0 then
            // 祝日の中に日曜日があれば
            if DayOfWeek(StrToDate(data)) <= HC + 1 then
               Hol := True;
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     data := Edit1.Text;
     Holiday(Sender);

     if Hol = True then
        Label1.Caption := '休みだ! (^o^)/~~' else
        Label1.Caption := '・・・仕事だ (;_;)';
end;

                                    J-OH!(VEC05267)

Original document by J-OH!       氏 ID:(VEC05267)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum