Delphiにて祭日を取得するには?


kuriox  2004-09-29 21:05:46  No: 11215

Delphiにて日付を与えて、その日が祭日であると判断できる関数はあるのでしょうか?

ご教授お願い致します。


にしの  2004-09-29 22:30:19  No: 11216

祭日は無理だと思います。
staticなりファイルなりに自前で祭日テーブルを持たせ、そこからチェックしたほうがよろしいかと。
いくつかの祭日は、第n月曜というように変わっているので、計算する必要もありますね。


にしの  2004-09-29 22:35:08  No: 11217

追記。
http://130.158.124.192/~takeuchi/delphi/browse.cgi?index=038539&back=http%3A%2F%2Fleed%2Eissp%2Eu%2Dtokyo%2Eac%2Ejp%2F%7Etakeuchi%2Fdelphi%2Farticle%2F038%2F038539%2Ehtml
他にも、探せば見つかりそう。


ether  2004-09-30 04:56:43  No: 11218

成人の日      1月の第2月曜日
春分の日      春分日
海の日        7月の第3月曜日
敬老の日      9月の第3月曜日
秋分の日      秋分日
体育の日      10月の第2月曜日
祝日が固定されていないのは上記6日と、    
「第3条 「国民の祝日」は、休日とする。
   2 「国民の祝日」が日曜日にあたるときは、その翌日を休日とする。
   3 その前日及び翌日が「国民の祝日」である日(その日が日曜日にあたる日及び前項に規定する休日にあたる日を除く。)は、休日とする。」
に該当する日ですね(5月4日と秋分日が水曜日ならば、前日の火曜日。かな?)。
春分日と秋分日は下記で計算できるようです。参考まで。
//----------------------------------------------
//春分日の計算(2099年まで)
function TForm1.Shunbun(Y: integer): integer;
var S1,S2:single;
begin
  S1:=(Y-2000)*0.242194;
  S2:=trunc((Y-2000)/4);
  result:=trunc(20.69115+S1-S2);
end;
//----------------------------------------------
//秋分日の計算(2099年まで)
function TForm1.Shubun(Y: integer): integer;
var S1,S2:single;
begin
  S1:=(Y-2000)*0.242194;
  S2:=trunc((Y-2000)/4);
  result:=trunc(23.09+S1-S2);
end;


ウォレス  2004-09-30 05:11:11  No: 11219

春分秋分は法律上その前年にならないと定義されませんね・・・
でも計算が狂う可能性は無いと言い切ってよいのでしょうが。

ごみレスでした


AY  2004-09-30 22:00:33  No: 11220

おかしなところあるかもしれませんが、参考になれば。
ちなみに、春分・秋分どこかの書き込みを参考に、
以外は、汚いですがゴリゴリ書いてます。
-----------------------------------------------------------------

unit holiday_func;

//      平成16年3月現在における祝日の扱い
// 国民の祝日は、「国民の祝日に関する法律」(昭和23年法律第178号)で定められた祝日。
// 休日になる。その日が日曜日にあたる場合、その翌日が振替休日となる。
// また、2つの「国民の祝日」の間隔が1日しかなく、その日が日曜日や振替休日でない場合、
// その間の日は国民の休日になる。 
//
//
//------------------------------------------------------------------------------------
//      元旦            1月1日          年のはじめを祝う。
//------------------------------------------------------------------------------------
//      成人の日                おとなになった事を自覚し、自ら生き抜こう
//                                      とする青年を祝い励ます。
//        〜1999年  1月15日
//        2000年〜  1月の第2月曜日
//------------------------------------------------------------------------------------
//      建国記念の日    政令で定める日(2月11日)  建国をしのび、国を愛する心を養う。
//------------------------------------------------------------------------------------
//      春分の日        春分日          自然をたたえ、生物をいつくしむ。
//------------------------------------------------------------------------------------
//      みどりの日   1989年〜  4月29日  自然に親しむと共に、その恩恵に感謝し
//                                      豊かな心を育む。
//                    昭和天皇の1989年の崩御の後、彼が自然を愛したことに
//                    因んで「みどりの日」とした。 
//------------------------------------------------------------------------------------
//      憲法記念日      5月3日          日本国憲法の施行を記念し、国の成長を期する。
//------------------------------------------------------------------------------------
//      こどもの日      5月5日          こどもの人格を重んじ、こどもの幸福を図ると共に
//                                      母に感謝する。
//------------------------------------------------------------------------------------
//      海の日                          海の恩恵に感謝すると共に、海洋国日本の繁栄を願う。
//        1996年〜2002年  7月20日
//              2003年〜      7月第3月曜日
//------------------------------------------------------------------------------------
//      敬老の日                        多年にわたり社会に尽くしてきた老人を敬愛し、
//                                      長寿を祝う。
//        〜2002年  9月15日
//        2003年〜  9月3月曜日
//------------------------------------------------------------------------------------
//      秋分の日        秋分日          先祖をうやまい、なくなった人々をしのぶ。
//------------------------------------------------------------------------------------
//      体育の日                スポーツにしたしみ、健康な身体をつちかう。
//               〜1999年  10月10日
//        2000年〜  10月の第2月曜日
//------------------------------------------------------------------------------------
//      文化の日        11月3日         自由と平和を愛し、文化をすすめる。
//------------------------------------------------------------------------------------
//      勤労感謝の日    11月23日        勤労を尊び生産を祝い、国民互いに感謝しあう。
//------------------------------------------------------------------------------------
//      天皇誕生日                      天皇の誕生日を祝う。
//          〜1988年  04月29日
//          1989年〜  12月23日
//
//******************************************************************************
interface

uses SysUtils,Classes,Windows,Controls,Graphics;

{*** 春分の日を返す 日付を渡す(使うのは年)}
Function IsHaru(AYear,AMonth,ADay: Word): Longint;
{*** 秋分の日を返す 日付を渡す(使うのは年)}
Function IsAki(AYear,AMonth,ADay: Word): Longint;
{*** 固定でない、祝日判定 Astringに休日名が格納される}
Function IsRandom_holiday(AYear,AMonth,ADay: Word): String;
{*** 固定の、祝日判定 Astringに休日名が格納される}
Function Isfix_holiday(AYear,AMonth,ADay: Word): String;
{*** 国民の休日の、判定 Astringに休日名が格納される}
Function Isfix_sando(AYear,AMonth,ADay: Word): String;
{*** 振り替え休日の、判定 Astringに'振替休日'が格納される  国民の休日よりあとで判断する必要あり。}
Function Isfurikae(AYear,AMonth,ADay: Word): String;

procedure youbi_horiday_set(target_date : Tdate; var str_youbi: String; var str_horiday : string;
                            var iro: TColor);

implementation

//******************************************************************************
//  春分の日の簡易計算式
//  day = INT(20.8431+0.242194*(Year-1980)-INT((Year-1980)/4))
//  (1980年から2099年まで 以降は補正の必要あり)
//  20.8431 : 1980年の春分通過点日時
//******************************************************************************
Function IsHaru(AYear,AMonth,ADay: Word) : Longint;
var
    ED,DumYear:Longint;
begin
    DumYear := AYear;
    if DumYear < 1980 then
        ED := Trunc(20.8357+0.242194*(DumYear-1980)-Trunc((DumYear-1983)/4))
    else
        ED := Trunc(20.8431+0.242194*(DumYear-1980)-Trunc((DumYear-1980)/4));
    Result := ED;
end;

//******************************************************************************
//  秋分の日の簡易計算式
//  day = INT(23.2488+0.242194*(Year-1980)-INT((Year-1980)/4))
//  (1980年から2099年まで 以降は補正の必要あり)
//  23.2488 : 1980年の秋分通過点日時
//******************************************************************************
Function IsAki(AYear,AMonth,ADay: Word) : Longint;
var
    ED,DumYear:Longint;
begin
    DumYear := AYear;
    if DumYear < 1980 then
        ED := Trunc(23.2588+0.242194*(DumYear-1980)-Trunc((DumYear-1983)/4))
    else
        ED := Trunc(23.2488+0.242194*(DumYear-1980)-Trunc((DumYear-1980)/4));
    Result := ED;
end;

//******************************************************************************
//  固定でない、祝日判定
//******************************************************************************
Function IsRandom_holiday(AYear,AMonth,ADay: Word): String;
Var
    DateComp : TDate;
begin
    DateComp := EncodeDate(AYear, AMonth, ADay);

    //  【成人の日】 2000年〜  1月の第2月曜日 ---------------------------------
    //  (1月で、月曜日で、7より大きい日)

    if (AYear >= 2000) and
      (AMonth = 1) and (DayOfWeek(DateComp) = 2) and (ADay > 7) and (ADay < 15) then begin
        Result := '成人の日';
        exit;
    end;

    //  【体育の日】  2000年〜  10月の第2月曜日 --------------------------------
    //  10月で、月曜日で、7より大きい日
    if (AYear >= 2000) and 
      (AMonth = 10) and (DayOfWeek(DateComp) = 2) and (ADay > 7) and (ADay < 15) then begin
        Result := '体育の日';
        exit;
    end;

    //  【海の日】  2003年〜    7月の第3月曜日 ---------------------------------
    //  7月で、月曜日で、14より大きい日
    if (AYear >= 2003) and 
      (AMonth = 7) and (DayOfWeek(DateComp) = 2) and (ADay > 14) and (ADay < 22) then begin
        Result := '海の日';
        exit;
    end;
    //  【敬老の日】  2003年〜  9月の第3月曜日 --------------------------------
    //  9月で、月曜日で、14より大きい日
    if (AYear >= 2003) and 
      (AMonth = 9)  and (DayOfWeek(DateComp) = 2) and (ADay > 14) and (ADay < 22) then begin
        Result := '敬老の日';
        exit;
    end;
    Result := '';
end;

//******************************************************************************
//  固定の、祝日判定
//******************************************************************************
Function Isfix_holiday(AYear,AMonth,ADay: Word): String;
begin
    if (AMonth = 1) and (ADay = 1) then begin
        Result := '元旦';
        exit;
    end;
    if (AYear <= 1999) and (AMonth = 1) and (ADay = 1) then begin
        Result := '成人の日';
        exit;
    end;
    if (AMonth = 2) and (ADay = 11) then begin
        Result := '建国記念日';
        exit;
    end;
    if (AYear >= 1989) and (AMonth = 4) and (ADay = 29) then begin
        Result := 'みどりの日';
        exit;
    end;
    if (AMonth = 5) and (ADay = 3) then begin
        Result := '憲法記念日';
        exit;
    end;
    if (AMonth = 5) and (ADay = 5) then begin
        Result := 'こどもの日';
        exit;
    end;
    if (AYear >= 1996) and (AYear <= 2002) and (AMonth = 7) and (ADay = 20) then begin
        Result := '海の日';
        exit;
    end;
    if (AYear <= 2002) and (AMonth = 9) and (ADay = 15) then begin
        Result := '敬老の日';
        exit;
    end;
    if (AYear <= 1999) and (AMonth = 10) and (ADay = 10) then begin
        Result := '体育の日';
        exit;
    end;
    if (AMonth = 11) and (ADay = 3) then begin
        Result := '文化の日';
        exit;
    end;
    if (AMonth = 11) and (ADay = 23) then begin
        Result := '勤労感謝の日';
        exit;
    end;
    
    if (AYear <= 1988) and (AMonth = 4) and (ADay = 29) then begin
        Result := '天皇誕生日';
        exit;
    end;
    if (AYear >= 1989) and (AMonth = 12) and (ADay = 23) then begin
        Result := '天皇誕生日';
        exit;
    end;
    Result := '';
end;

//******************************************************************************
//  国民の休日の、判定
//******************************************************************************
Function Isfix_sando(AYear,AMonth,ADay: Word): String;
Var
    DateComp : TDate;
    Yearwk, Monthwk, Daywk : Word;
begin
    DateComp := EncodeDate(AYear, AMonth, ADay);
    
    //自分自身は 、火曜日から 土曜日の間で 前後共に 祝日の場合 自分は国民の休日扱いとなる。
    if (DayOfWeek(DateComp) >= 3) and (DayOfWeek(DateComp) <= 7) then begin
        //前日が祝日で
        DecodeDate(DateComp - 1, Yearwk, Monthwk, Daywk);
        if ((Monthwk = 3) and (Isharu(Yearwk, Monthwk, Daywk) = Daywk)) or
           ((Monthwk = 9) and (Isaki(Yearwk, Monthwk, Daywk) = Daywk )) or
           (Israndom_holiday(Yearwk, Monthwk, Daywk) <> '') or
           (Isfix_holiday(Yearwk, Monthwk, Daywk) <> '' ) then begin
           //後日が休日だったら
            DecodeDate(DateComp + 1, Yearwk, Monthwk, Daywk);
            if ((Monthwk = 3) and (Isharu(Yearwk, Monthwk, Daywk) = Daywk)) or
               ((Monthwk = 9) and (Isaki(Yearwk, Monthwk, Daywk) = Daywk )) or
               (Israndom_holiday(Yearwk, Monthwk, Daywk) <> '') or
               (Isfix_holiday(Yearwk, Monthwk, Daywk) <> '' ) then begin
                Result := '国民の休日';
                exit;
            end;
        end;
    end;

    Result := '';

end;
//******************************************************************************
//  振替休日の判定
//******************************************************************************
Function Isfurikae(AYear,AMonth,ADay: Word): String;
Var
    DateComp : TDate;
    Yearwk, Monthwk, Daywk : Word;
begin
    DateComp := EncodeDate(AYear, AMonth, ADay);
    DecodeDate(DateComp - 1, Yearwk, Monthwk, Daywk);
    DateComp := DateComp - 1;
  Result := '';
    // 前日が日曜日でなければ、振替休日では無い。
  if DayOfWeek(DateComp) = 1 then begin
    // 春分の日?
        if ((Monthwk = 3) and (Isharu(Yearwk, Monthwk, Daywk) = Daywk)) then begin
          Result := '振替休日';
          exit;
        end;

        // 秋分の日?
        if ((Monthwk = 9) and (Isaki(Yearwk, Monthwk, Daywk) = Daywk)) then begin
          Result := '振替休日';
          exit;
        end;

        // 固定の休日?
    if Isfix_holiday(Yearwk,Monthwk,Daywk) <> '' then begin
          Result := '振替休日';
          exit;
        end;

        // 非固定の休日?
        if IsRandom_holiday(Yearwk,Monthwk,Daywk) <> '' then begin
          Result := '振替休日';
          exit;
        end;

    end;
end;

//******************************************************************************
//  判定したい日を渡すと、曜日文字、休日名、カラーcdをセットする。
//    youbi_horiday_set(日付,曜日(参照),休日(参照),色(参照));
//******************************************************************************
procedure youbi_horiday_set(target_date : Tdate;var str_youbi: String;
    var str_horiday: string;var iro: TColor);
Var
    AYear,AMonth,ADay: Word;
begin
    iro := clBlack;
    case DayOfWeek(target_date) of
        1: begin
                str_youbi  := '日';
                iro := $000000EC; //clRed;
           end;
        2: begin
                str_youbi  := '月';
           end;
        3: begin
                str_youbi  := '火';
           end;
        4: begin
                str_youbi  := '水';
           end;
        5: begin
                str_youbi  := '木';
           end;
        6: begin
                str_youbi  := '金';
           end;
        7: begin
                str_youbi  := '土';
                iro := $00F20000; //clBlue;
           end;
    end;

    DecodeDate(target_date,AYear, AMonth, ADay);

    str_horiday := '';
    // 春分の日の判定
    if (str_horiday = '') and (AMonth = 3) then
        if ADay = Isharu(AYear, AMonth, ADay) then str_horiday := '春分の日';

    // 秋分の日の判定
    if (str_horiday = '') and (AMonth = 9) then
        if ADay = Isaki(AYear, AMonth, ADay) then  str_horiday := '秋分の日';

    // 固定の祝日判定
    if str_horiday = '' then str_horiday := Isfix_holiday(AYear, AMonth, ADay);

    // 固定でない祝日判定
    if str_horiday = '' then str_horiday := IsRandom_holiday(AYear, AMonth, ADay);

    // 国民の休日判定
    if str_horiday = '' then str_horiday := Isfix_sando(AYear, AMonth, ADay);

    // 振替休日判定
    if str_horiday = '' then str_horiday := Isfurikae(AYear, AMonth, ADay);

    // 休日名が存在すれば、カラーは赤に設定
    if str_horiday <> '' then
        iro := $00F200F2; //clRed;

end;

end.


AY  2004-09-30 22:05:36  No: 11221

これは、ソフトでカレンダー作成をする際に作ったものですが
呼び出し側で、固定休日、固定以外・・と順次聞かないと
事足りません。
一発がよければ、手を加えてくださいね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加