※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
←↑→ (5)祝祭日の計算


曜日を克服した次に待っているのは祝祭日です。

これには下記のようなものがあります。詳しいことはこちらをご覧ください。

元日        1月 1日 
成人の日      1月第2月曜
建国記念日    2月11日
春分の日     春分日
みどりの日    4月29日
憲法記念日    5月 3日
こどもの日    5月 5日
海の日     7月20日
敬老の日      9月15日
秋分の日     秋分日
体育の日     10月第2月曜
文化の日     11月 3日
勤労感謝の日 11月23日
天皇誕生日   12月23日

振替休日     国民の祝日が日曜日に当たった時翌月曜日
国民の祝日   5月 4日 (国民の祝日にはさまれた日)

このほか「祝日」ではなく「祭日」ですが、近年下記のような臨時祭日が
ありました。
  1989年 2月24日 昭和天皇大葬の礼
  1990年11月12日 今上天皇即位の礼
  1993年 6月 9日 皇太子結婚の儀

なお、成人の日、体育の日は、1999年までは1月15日、10月10日でした。その
ほかどの祝祭日がいつから適用されているかについては、こちらをご覧ください。

/*********************************************************************
 * 日祭日チェック
 *    return : 0=平日 1=普通の土曜 2=普通の日曜
 *             3=国民の祝日 4=国民の祝日に挟まれた日 5=臨時の祭日
 *             6=振替休日
 *    yobi   : 0=Sun, 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat
 *             (NUL指定の時は返さない)
 *    name   : 国民の祝日の名前
 *             (NUL指定の時は返さない)
 ********************************************************************/
int YobiSaizitu(long ymd, int* yobi, char* name)
{
    long yy,mm,dd;
    DateSep(ymd, &yy, &mm, &dd);
    return YobiCheckSaizitu(yy,mm,dd, yobi, name);
}
int YobiSaizitu(long yy, long mm, long dd, int* yobi, char* name)
{
    int w_yobi,ww;

    w_yobi = Yobi(yy,mm,dd);
    if (yobi)
        *yobi = w_yobi;
        
    //その年固有の祝日を設定する  ....このルーチンはリエントラントではない。
    //                リエントラントにするにはこのテーブル
    //                をコピーして使用する必要がある。
    YobiSaizituThisYear(yy);
    
    //祝日チェック
    ww = YobiSaizitu1(yy, mm, dd, name);
    if (ww)
        return(ww);  /* 3 or 5 */

    ///前日を調べる
    ww = YobiSaizitu1(yy, mm, dd-1, 0);      // 月末に祝日は無い!
    if (ww)
    {
        ww = YobiSaizitu1(yy, mm, dd+1, 0);
        if (ww)
        {
            if (name)
                strcpy(name,"国民の祝日");
            return(4);
        }
        if (w_yobi==1)
        {
            if (name)
                strcpy(name, "振替休日");
            return(6);
        }
    }
    ///以下は普通の日
    if (w_yobi==0)
         return(2);
    if (w_yobi==6)
         return(1);
    return(0);

}
// 祭日テーブルのチェック
int YobiSaizitu1(long yy, long mm, long dd, char* name)
{
    int i,wdd;

    for(i=0; SyukuTbl[i].mm; i++)
    {
        if (SyukuTbl[i].mm == mm && SyukuTbl[i].dd == dd &&
            SyukuTbl[i].y1 <= yy && yy <= SyukuTbl[i].y2)
        {
            if (name)
                strcpy(name, SyukuTbl[i].name);
            if (SyukuTbl[i].y1 == SyukuTbl[i].y2)
                return(5);
            else
                return(3);
        }
    }
    return(0);
}

void YobiSaizituThisYear(int year)
{
	static int nowyear=0;
    int i,k;
    if (nowyear==year)
    	return;

   for(i=0; SyukuTbl[i].mm; i++)
   {
       if (meq(SyukuTbl[i].name,"春分"))
           SyukuTbl[i].dd = GetEquinoxSpring(year);
       if (meq(SyukuTbl[i].name,"秋分"))
           SyukuTbl[i].dd = GetEquinoxAutumn(year);
       if (SyukuTbl[i].dd == 41)  //第2月曜
       {
           k = Yobi(year, SyukuTbl[i].mm, 1);
           SyukuTbl[i].dd = (8-k)%7 + 8;
       }
   }
   nowyear=year;

}

祝祭日テーブルは下記のようになります。

typedef struct {
	int mm;
	int dd;
	int y1;
	int y2;
	char* name;
} SYUKUZITU;

static SYUKUZITU SyukuTbl[] = {
    { 1, 1,   0,9999, "元日"},
    { 1,15,1949,1999, "成人の日"},
    { 1,41,2000,9999, "成人の日"},
    { 2,11,1967,9999, "建国記念の日"},
    { 3,90,   0,9999, "春分の日"},
    { 4,29,1927,1988, "天皇誕生日"},
    { 4,29,1989,9999, "みどりの日"},
    { 5, 3,1948,9999, "憲法記念日"},
    { 5, 5,1948,9999, "子供の日"},
    { 7,20,1995,9999, "海の日"},
    { 9,15,1966,9999, "敬老の日"},
    { 9,91,   0,9999, "秋分の日"},
    {10,10,1966,1999, "体育の日"},
    {10,41,2000,9999, "体育の日"},
    {11, 3,1868,9999, "文化の日"},
    {11,23,   0,9999, "勤労感謝の日"},
    {12,23,1989,9999, "天皇誕生日"},
    { 2,24,1989,1989, "昭和天皇大葬の礼"},
    {11,12,1990,1990, "今上天皇即位の礼"},
    { 6, 9,1993,1993, "皇太子結婚の儀"},
    { 0, 0,   0,   0, 0} };

なお、春分日、秋分日の計算に関しては、私に権利がないので開示できませ
ん。オブジェクトライブラリの方では、暦計算研究会さんの計算式を許可を
頂いて使用しています。この計算式については、同会編の「新こよみ便利帳」
(恒星社厚生閣)をごらん下さい。

なお、このルーチンは戦後の祝日のみに対応しています。戦前の祝日につい
ても処理する場合は、こちらをご覧ください。



←↑→
(C)copyright ffortune.net 1995-2007 produced by ffortune and Lumi.
お問い合わせはこちらから