掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Delphiにて祭日を取得するには? (ID:11220)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
おかしなところあるかもしれませんが、参考になれば。 ちなみに、春分・秋分どこかの書き込みを参考に、 以外は、汚いですがゴリゴリ書いてます。 ----------------------------------------------------------------- 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.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.