改編対策本部の10年カレンダーで使用している祝日判定JavaScript


function JapaneseGovernmentHoliDayCheck (myTime) { 
    var myHoliDay = false, myMonth = myTime.getMonth () + 1, myDate = myTime.getDate ();
    if (JapaneseHoliDayCheck (myTime) == 1) { 
        if (myTime.getFullYear () * 372 + myMonth * 31 + myDate >= 741180) { 
            myHoliDay = true;
        } else { 
            if (Math.floor((myTime.getFullYear () * 372 + myMonth * 31 + myDate + 340) / 1240) * 3 + Math.ceil (myDate / 7) % 2 == 1791) { 
                myHoliDay = true;
            } else;
        }
    } else { 
        if (JapaneseHoliDayCheck (myTime) >= 2) { 
            myHoliDay = true;
        } else { 
            if (Math.floor ((myMonth * 31 + myDate + 331) / 366) != 1) { 
                myHoliDay = true;
            } else;
        }
    }
    return myHoliDay;
}

function JapaneseBankHoliDayCheck (myTime) { 
    var myHoliDay = false, myMonth = myTime.getMonth () + 1, myDate = myTime.getDate ();
    if (JapaneseHoliDayCheck (myTime) == 1) { 
        if (myTime.getFullYear () * 372 + myMonth * 31 + myDate >= 739974) { 
            myHoliDay = true;
        } else { 
            if (Math.floor ((myTime.getFullYear () * 372 + myMonth * 31 + myDate - 50) / 918) * 3 + Math.round ((myDate - 1) / 14) == 2416) { 
                myHoliDay = true;
            } else { 
                if (Math.floor ((myTime.getFullYear () * 372 + myMonth * 31 + myDate - 516) / 1119) * 5 + Math.ceil (myDate / 7) == 3297) { 
                    myHoliDay = true;
                } else;
            }
        }
    } else { 
        if (JapaneseHoliDayCheck (myTime) >= 2) { 
            myHoliDay = true;
        } else { 
            if (Math.floor ((myMonth * 31 + myDate + 333) / 368) != 1) { 
                myHoliDay = true;
            } else;
        }
    }
    return myHoliDay;
}

function JapaneseHoliDayCheck (myTime) { 
    var myHoliDay, myHoliDayName = JapaneseHoliDay (myTime), myWeekDay = myTime.getDay ();
    if (myHoliDayName == "国民の休日") { 
        myHoliDay = 3;
    } else { 
        if (myHoliDayName == "振替休日") { 
            myHoliDay = 4;
        } else { 
            if (myHoliDayName  != "") { 
                myHoliDay = 5;
            } else { 
                if (myWeekDay == 6) { 
                    myHoliDay = 1;
                } else { 
                    if (myWeekDay == 0) { 
                        myHoliDay = 2;
                    } else { 
                        myHoliDay = 0;
                    }
                }
            }
        }
    }
    return myHoliDay;
}

function JapaneseHoliDay (myTime) { 
    var myHoliDay = "";
    var myCheckTime = new Date (myTime.getFullYear (), myTime.getMonth (), myTime.getDate (), 0, 0, 0);
    var sw = 0, myHoliDay2, myCheckTime2, myVernalEquinox, myAutumnalEquinox, myYear, myMonth, myDate, myWeekDay;
    if (myCheckTime.getTime () >= new Date(1948, 6, 20, 0, 0, 0).getTime ()) { // 戦後の祝日判定
// 新しい振替休日条項を、そのまま忠実に再現するのであれば、振休判定ロジックは次のようになる。
//        for (i = 0; i <= 7; i ++) { 
        do {  // 振替休日判定の方式をAddinBox方式に変更(月曜が祝日でない場合に前日の日曜の祝日判定を行い、祝日なら振休とする方式)
            myCheckTime2 = new Date (myCheckTime.getFullYear (), myCheckTime.getMonth (), (myCheckTime.getDate () - sw), 0, 0, 0);
            myHoliDay2 = "";
            myYear = myCheckTime2.getFullYear ();
            myMonth = myCheckTime2.getMonth () + 1;
            myDate = myCheckTime2.getDate ();
            myWeekDay = myCheckTime2.getDay (); // myWeekDayの値は日が1、月が2、火が3、水が4、木が5、金が6、土が7
            switch (myMonth) { 
// 月別の判定順を過労死しにくい月順に並べ替え
                case 2// 2月
                    if (myDate == 11) { 
                        if (myYear >= 1967) { 
                            myHoliDay2 = "建国記念の日";
                        } else;
                    } else { 
                        if (myYear * 29 + myDate == 57705) { 
                            myHoliDay2 = "昭和天皇の大喪の礼";
                        } else;
                    }
                    break;
                case 7// 7月
                    if (myYear >= 2003) { 
                        if (Math.ceil (myDate / 7) * 7 + myWeekDay == 22) { 
                            myHoliDay2 = "海の日";
                        } else;
                    } else { 
                        if (Math.floor ((myYear - 1) / 7) * 31 + myDate == 8855) { 
                            myHoliDay2 = "海の日";
                        } else;
                    }
                    break;
                case 1// 1月
                    if (myDate == 1) { 
                        myHoliDay2 = "元日";
                    } else { 
                        if (myYear >= 2000) { 
                            if (Math.ceil (myDate / 7) * 7 + myWeekDay == 15) 
                                myHoliDay2 = "成人の日";
                            } else;
                        } else { 
                            if (myDate == 15) { 
                                myHoliDay2 = "成人の日";
                            } else;
                        }
                    }
                    break;
                case 8// 8月
                    break;
                case 9// 9月
                    if (myYear < 2151) { // 秋分の計算
                        if (myYear >= 2100) { 
                            myAutumnalEquinox = Math.floor (24.2488 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                        } else { 
                            if (myYear >= 1980) { 
                                myAutumnalEquinox = Math.floor (23.2488 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                            } else { 
                                if (myYear >= 1948) { 
                                    myAutumnalEquinox = Math.floor (23.2588 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                                } else;
                            }
                        }
                    } else { 
                        myAutumnalEquinox = 99;
                    }
                    if (myDate == myAutumnalEquinox) { 
                        myHoliDay2 = "秋分の日";
                    } else { 
                        if (myYear >= 2003) { 
                            if (Math.ceil (myDate / 7) * 7 + myWeekDay == 22) { 
                                myHoliDay2 = "敬老の日";
                            } else { 
                                if (myDate * 7 + myWeekDay == myAutumnalEquinox * 7 - 5) { 
                                    myHoliDay2 = "国民の休日";
                                } else;
                            }
                        } else { 
                            if (Math.floor ((myYear - 5) / 37) * 30 + myDate == 1605) { 
                                myHoliDay2 = "敬老の日";
                            } else;
                        }
                    }
                    break;
                case 11// 11月
                    if (myDate == 3) { 
                        myHoliDay2 = "文化の日";
                    } else { 
                        if (myDate == 23) { 
                            myHoliDay2 = "勤労感謝の日";
                        } else { 
                            if (myYear * 30 + myDate == 59712) { 
                                myHoliDay2 = "即位礼正殿の儀";
                            } else;
                        }
                    }
                    break;
                case 5// 5月
                    if (myDate == 4) { 
                        if (myYear >= 2007) { 
                            myHoliDay2 = "みどりの日";
                        } else { 
                            if (Math.floor ((myYear + 9) / 21) * 2 + Math.floor ((myWeekDay + 3) / 5) == 191) { 
                                myHoliDay2 = "国民の休日";
                            } else;
                        }
                    } else { 
// 新しい振替休日条項を、そのまま忠実に再現するのであれば、以下の振休判定は不要
// 2007年以降の憲法記念日orみどりの日が日曜日のケースのみ、ここで判定
                        if (myDate * 4 + Math.floor (myWeekDay / 2) == 25) { 
                            if (myYear >= 2007) { 
                                myHoliDay2 = "振替休日";
                            } else;
                        } else { 
                            if (myDate == 3) { 
                                myHoliDay2 = "憲法記念日";
                            } else { 
                                if (myDate == 5) { 
                                    myHoliDay2 = "こどもの日";
                                } else;
                            }
                        }
                    }
                    break;
                case 10: // 10月
                    if (myYear >= 2000) { 
                        if (Math.ceil (myDate / 7) * 7 + myWeekDay == 15) { 
                            myHoliDay2 = "体育の日";
                        } else;
                    } else { 
                        if (Math.floor ((myYear - 5) / 37) * 31 + myDate == 1653) { 
                            myHoliDay2 = "体育の日";
                        } else;
                    }
                    break;
                case 12// 12月
                    if (myDate == 23) { 
                        if (myYear >= 1989) { 
                            myHoliDay2 = "天皇誕生日";
                        } else;
                    } else;
                    break;
                case 3// 3月
                    if (myYear < 2151) { // 春分の計算
                        if (myYear >= 2100) { 
                            myVernalEquinox = Math.floor (21.8510 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                        } else { 
                            if (myYear >= 1980) { 
                                myVernalEquinox = Math.floor (20.8431 + 0.242194 * (myYear - 1980)- Math.floor((myYear - 1980) / 4));
                            } else { 
                                if (myYear >= 1949) { 
                                    myVernalEquinox = Math.floor (20.8357 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                                } else { 
                                    myVernalEquinox = 99;
                                }
                            }
                        }
                    } else { 
                        myVernalEquinox = 99;
                    }
                    if (myDate == myVernalEquinox) { 
                        myHoliDay2 = "春分の日";
                    } else;
                    break;
                case 6// 6月
                    if (myYear * 30 + myDate == 59799) { 
                        myHoliDay2 = "皇太子徳仁親王の結婚の儀";
                    } else;
                    break;
                default: // 4月
                    if (myDate == 29) { 
                        if (myYear >= 2007) { 
                            myHoliDay2 = "昭和の日";
                        } else { 
                            if (myYear >= 1989) { 
                                myHoliDay2 = "みどりの日";
                            } else { 
                                myHoliDay2 = "天皇誕生日";
                            }
                        }
                    } else { 
                        if (myYear * 30 + myDate == 58780) { 
                            myHoliDay2 = "皇太子明仁親王の結婚の儀";
                        } else;
                    }
                    break;
            }
// 新しい振替休日条項を、そのまま忠実に再現するのであれば、振休判定ロジックは次のようになる。
//            if (sw == 0) { 
//                if (myHoliDay2 != "") { 
//                    myHoliDay = myHoliDay2;
//                    break;
//                } else { 
//                    if (myCheckTime2.getTime () < new Date (2007, 0, 1, 0, 0, 0).getTime ()) { 
//                        if (myWeekDay != 1) { 
//                            break;
//                        } else;
//                    } else { 
//                        if (myCheckTime2.getTime () < new Date (1973, 3, 12, 0, 0, 0).getTime ()) { 
//                            break;
//                        } else;
//                    }
//                }
//            } else { 
//                if (myHoliDay2 != "") { 
//                    if (myWeekDay == 0) { 
//                        myHoliDay = "振替休日";
//                        break;
//                    } else;
//                } else { 
//                    break;
//                }
//            }
            if (sw == 0) { 
                if (myHoliDay2 != "") { 
                    myHoliDay = myHoliDay2;
                    break;
                } else { 
                    if (myWeekDay != 1) { 
// 月曜以外は振替休日判定不要
// 2007年以降の憲法記念日・みどりの日の振替休日は上記ステップで処理済
// こどもの日の振替休日はここで判定する
                        break;
                    } else { 
                        if (myYear * 372 + myMonth * 31 + myDate < 734092) { 
                            break;
                        } else;
                    }
                }
            } else { 
                if (myHoliDay2 != "") { 
                    myHoliDay = "振替休日";
                } else;
            }
        } while (sw ++ == 0);
    } else { // 戦前の祝日判定
        if (myCheckTime.getTime () >= new Date(1873, 9, 14, 0, 0, 0).getTime ()) { 
            myYear = myCheckTime.getFullYear ();
            myMonth = myCheckTime.getMonth () + 1;
            myDate = myCheckTime.getDate ();
            switch (myMonth) { 
                case 2// 2月
                    if (myDate == 11) { 
                        myHoliDay = "紀元節";
                    } else;
                    break;
                case 7// 7月
                    if (Math.floor ((myYear + 5) / 14) * 31 + myDate == 4277) { 
                        myHoliDay = "明治天皇祭";
                    } else;
                    break;
                case 1// 1月
                    if (myDate == 3) { 
                        myHoliDay = "元始祭";
                    } else { 
                        if (myDate == 5) { 
                            myHoliDay = "新年宴會";
                        } else { 
                            if (Math.floor ((myYear - 2) / 39) * 31 + myDate == 1518) { 
                                myHoliDay = "孝明天皇祭";
                            } else;
                        }
                    }
                    break;
                case 8// 8月
                    if (Math.floor ((myYear + 5) / 14) * 31 + myDate == 4278) { 
                        myHoliDay = "天長節";
                    } else;
                    break;
                case 9// 9月
                    if (myYear < 1948) { // 秋分の計算
                        if (myYear >= 1900) { 
                            myAutumnalEquinox = Math.floor (23.2588 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                        } else { 
                            if (myYear >= 1878) { 
                                myAutumnalEquinox = Math.floor (22.2588 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                            } else { 
                                myAutumnalEquinox = 99;
                            }
                        }
                    } else { 
                        myAutumnalEquinox = 99;
                    }
                    if (Math.floor ((myYear + 1) / 5) * 30 + myDate == 11267) { 
                        myHoliDay = "神嘗祭";
                    } else { 
                        if (Math.floor ((myYear + 12) / 70) * 30 + myDate == 810 + myAutumnalEquinox) { 
                            myHoliDay = "秋季皇靈祭";
                        } else;
                    }
                    break;
                case 11// 11月
                    if (myDate == 3) { 
                        if (myYear >= 1927) { 
                            myHoliDay = "明治節";
                        } else { 
                            if (myYear < 1912) { 
                                myHoliDay = "天長節";
                            } else;
                        }
                    } else { 
                        if (myDate == 23) { 
                            myHoliDay = "新嘗祭";
                        } else { 
                            if (Math.abs (myYear - 1921.5) * 30 + myDate == 205) { 
                                myHoliDay = "即位ノ禮";
                            } else { 
                                if (Math.abs (myYear - 1921.5) * 30 + myDate == 209) { 
                                    myHoliDay = "大嘗祭";
                                } else { 
                                    if (Math.abs (myYear - 1921.5) * 30 + myDate == 211) { 
                                        myHoliDay = "即位禮及大嘗祭後大饗第一日";
                                    } else;
                                }
                            }
                        }
                    }
                    break;
                case 5// 5月
                    break;
                case 10// 10月
                    if (Math.floor ((myYear - 16) / 69) * 31 + myDate == 854) { 
                        myHoliDay = "神嘗祭";
                    } else { 
                        if (Math.floor ((myYear + 5) / 14) * 31 + myDate == 4278) { 
                            myHoliDay = "天長節祝日";
                        } else;
                    }
                    break;
                case 12// 12月
                    if (Math.floor ((myYear + 5) / 21) * 31 + myDate == 2877) { 
                        myHoliDay = "大正天皇祭";
                    } else;
                    break;
                case 3// 3月
                    if (myYear < 1949) { // 春分の計算
                        if (myYear >= 1900) { 
                            myVernalEquinox = Math.floor (20.8357 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                        } else { 
                            if (myYear >= 1879) { 
                                myVernalEquinox = Math.floor (19.8277 + 0.242194 * (myYear - 1980) - Math.floor((myYear - 1980) / 4));
                            } else { 
                                myVernalEquinox = 99;
                            }
                        }
                    } else { 
                        myVernalEquinox = 99;
                    }
                    if (Math.floor ((myYear + 11) / 70) * 31 + myDate == 837 + myVernalEquinox) { 
                        myHoliDay = "春季皇靈祭";
                    } else;
                    break;
                case 6// 6月
                    break;
                default: // 4月
                    if (myDate == 3) { 
                        myHoliDay = "神武天皇祭";
                    } else { 
                        if (Math.floor ((myYear + 9) / 22) * 30 + myDate == 2669) { 
                            myHoliDay = "天長節";
                        } else;
                    }
                    break;
            }
        } else;
    }
    return myHoliDay;
}
// 以下(Copyright)は必ず記載のこと
// Copyright (C) 2005 Kaihen Taisaku Hombu (Program-Renewal Research Institute). All Rights Reserved.


戻る
Copyright © 2005 Kaihen Taisaku Hombu (Program-Renewal Research Institute). All Rights Reserved.