欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过JS判断参数日期是否为日本的祝日

程序员文章站 2022-04-12 21:42:19
Js代码  //另封装了一个方法,周日也是休息日  Js代码  //因没看懂文件开头写的什么,所以不好在原有文件直接再封装方法,所以...

Js代码 
//另封装了一个方法,周日也是休息日 
Js代码 
//因没看懂文件开头写的什么,所以不好在原有文件直接再封装方法,所以下面这个方法是在另一个JS文件中写的。 
Js代码 
function isHoliDays(sdate){//sdate="yyyy/mm/dd" 
 var tdate=new Date(sdate); 
 if(tdate.getDay()==0){ 
  return true; 
 }else{ 
  var ts=ktHolidayName(sdate); 
  if(ts!=""){ 
   return true; 
  }else{ 
   return false; 
  } 
 } 

Js代码 
很全春分,秋分,振替休日等都有,并根据相关节假日发布时间开始算。 
Js代码 
<!-- 
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 
//_/ 
//_/ CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved. 
//_/ ( http://www.h3.dion.ne.jp/~sakatsu/index.htm
//_/ 
//_/ この祝日判定コードは『Excel:kt関数アドイン』で使用している 
//_/ VBAマクロを[JavaScript]に移植したものです。 
//_/ この関数では、2007年施行の改正祝日法(昭和の日)までを 
//_/ サポートしています(9月の国民の休日を含む)。 
//_/ 
//_/ (*1)このコードを引用するに当たっては、必ずこのコメントも 
//_/ 一緒に引用する事とします。 
//_/ (*2)他サイト上で本マクロを直接引用する事は、ご遠慮願います。 
//_/ 【 http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm 】 
//_/ へのリンクによる紹介で対応して下さい。 
//_/ (*3)[ktHolidayName]という関数名そのものは、各自の環境に 
//_/ おける命名規則に沿って変更しても構いません。 
//_/  
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 
// 
// 2008/10/29 変数のvar指定が無く、広域変数扱いになっていたのを修正しました。 
// 
// 2011/3/20  FireFox3.5/3.6で使用した場合に間違った結果を返す場合がありました。 
//            FireFoxのJITコンパイラ(TraceMonkey)の不具合によるswitchステートメ 
//            ントの誤コンパイルが原因であると判明したため、switchを[if else]に 
//            変更しました。なお、本スクリプトのバグではありませんので、FireFox 
//            以外のブラウザでは問題は起きていません(修正前のswitchを使ったスク 
//            リプトでもFireFox以外のブラウザでは正常に動作します)。 
//            このFireFoxのバグに関する解説を下記に整理してあります。 
//              http://www.h3.dion.ne.jp/~sakatsu/FireFox_TMBugTest.htm 
//            修正前のswitchを使ったバージョンは下記に残してあります。 
//              http://www.h3.dion.ne.jp/~sakatsu/HolidayChk_switch.js 
 
var MONDAY = 1; 
var TUESDAY = 2; 
var WEDNESDAY = 3; 
 
// JavaScriptで扱える日付は1970/1/1~のみ 
//var cstImplementTheLawOfHoliday = new Date("1948/7/20");  // 祝日法施行 
//var cstAkihitoKekkon = new Date("1959/4/10");              // 明仁親王の結婚の儀 
var cstShowaTaiso = new Date("1989/2/24");                // 昭和天皇大喪の礼 
var cstNorihitoKekkon = new Date("1993/6/9");            // 徳仁親王の結婚の儀 
var cstSokuireiseiden = new Date("1990/11/12");          // 即位礼正殿の儀 
var cstImplementHoliday = new Date("1973/4/12");        // 振替休日施行 
 
// [prmDate]には "yyyy/m/d"形式の日付文字列を渡す 
function ktHolidayName(prmDate) 

  var MyDate = new Date(prmDate); 
  var HolidayName = prvHolidayChk(MyDate); 
  var YesterDay; 
  var HolidayName_ret; 
 
  if (HolidayName == "") { 
      if (MyDate.getDay() == MONDAY) { 
          // 月曜以外は振替休日判定不要 
          // 5/6(火,水)の判定はprvHolidayChkで処理済 
          // 5/6(月)はここで判定する 
          if (MyDate.getTime() >= cstImplementHoliday.getTime()) { 
              YesterDay = new Date(MyDate.getFullYear(), 
                                     MyDate.getMonth(),(MyDate.getDate()-1)); 
              HolidayName = prvHolidayChk(YesterDay); 
              if (HolidayName != "") { 
                  HolidayName_ret = "振替休日"; 
              } else { 
                  HolidayName_ret = ""; 
              } 
          } else { 
              HolidayName_ret = ""; 
          } 
      } else { 
          HolidayName_ret = ""; 
      } 
  } else { 
      HolidayName_ret = HolidayName; 
  } 
 
  return HolidayName_ret; 

 
//=============================================================== 
 
function prvHolidayChk(MyDate) 

  var MyYear = MyDate.getFullYear(); 
  var MyMonth = MyDate.getMonth() + 1;    // MyMonth:1~12 
  var MyDay = MyDate.getDate(); 
  var NumberOfWeek; 
  var MyAutumnEquinox; 
 
// JavaScriptで扱える日付は1970/1/1~のみで祝日法施行後なので下記は不要 
// if (MyDate.getTime() < cstImplementTheLawOfHoliday.getTime()) { 
//   return ""; // 祝日法施行(1948/7/20)以前 
// } else; 
 
  var Result = ""; 
 
// 1月 // 
  if (MyMonth == 1) { 
      if (MyDay == 1) { 
          Result = "元日"; 
      } else { 
          if (MyYear >= 2000) { 
              NumberOfWeek = Math.floor((MyDay - 1) / 7) + 1; 
              if ((NumberOfWeek == 2) && (MyDate.getDay() == MONDAY)) { 
                  Result = "成人の日"; 
              } else; 
          } else { 
              if (MyDay == 15) { 
                  Result = "成人の日"; 
              } else; 
          } 
      } 
      return Result; 
  } else; 
 
// 2月 // 
  if (MyMonth == 2) { 
      if (MyDay == 11) { 
          if (MyYear >= 1967) { 
              Result = "建国記念の日"; 
          } else; 
      } else { 
          if (MyDate.getTime() == cstShowaTaiso.getTime()) { 
              Result = "昭和天皇の大喪の礼"; 
          } else; 
      } 
      return Result; 
  } else; 
 
// 3月 // 
  if (MyMonth == 3) { 
      if (MyDay == prvDayOfSpringEquinox(MyYear)) {  // 1948~2150以外は[99] 
          Result = "春分の日";                       // が返るので、必ず≠になる 
      } else; 
      return Result; 
  } else; 
 
// 4月 // 
  if (MyMonth == 4) { 
      if (MyDay == 29) { 
          if (MyYear >= 2007) { 
              Result = "昭和の日"; 
          } else { 
              if (MyYear >= 1989) { 
                  Result = "みどりの日"; 
              } else { 
                Result = "天皇誕生日"; 
              } 
          } 
      } else { 
          // JavaScriptで扱える日付は1970/1/1~のみなので下記は不要 
          // if (MyDate.getTime() == cstAkihitoKekkon.getTime()) { 
          //   Result = "皇太子明仁親王の結婚の儀";  // (=1959/4/10) 
          // } else; 
      } 
      return Result; 
  } else; 
 
// 5月 // 
  if (MyMonth == 5) { 
      if (MyDay == 3) {  // 5月3日 
          Result = "*記念日"; 
      } else; 
 
      if (MyDay == 4) {  // 5月4日 
          if (MyYear >= 2007) { 
              Result = "みどりの日"; 
          } else { 
              if (MyYear >= 1986) { 
                  if (MyDate.getDay() > MONDAY) { 
                  // 5/4が日曜日は『只の日曜』、月曜日は『*記念日の振替休日』(~2006年) 
                      Result = "国民の休日"; 
                  } else; 
              } else; 
          } 
      } else; 
 
      if (MyDay == 5) {  // 5月5日 
          Result = "こどもの日"; 
      } else; 
 
      if (MyDay == 6) {  // 5月6日 
          if (MyYear >= 2007) { 
              if ((MyDate.getDay() == TUESDAY) || (MyDate.getDay() == WEDNESDAY)) { 
                  Result = "振替休日";    // [5/3,5/4が日曜]ケースのみ、ここで判定 
              } else; 
          } else; 
      } else; 
 
      return Result; 
  } else; 
 
// 6月 // 
  if (MyMonth == 6) { 
      if (MyDate.getTime() == cstNorihitoKekkon.getTime()) { 
          Result = "皇太子徳仁親王の結婚の儀"; 
      } else; 
      return Result; 
  } else; 
 
// 7月 // 
  if (MyMonth == 7) { 
      if (MyYear >= 2003) { 
          NumberOfWeek = Math.floor((MyDay - 1) / 7) + 1; 
          if ((NumberOfWeek == 3) && (MyDate.getDay() == MONDAY)) { 
              Result = "海の日"; 
          } else; 
      } else { 
          if (MyYear >= 1996) { 
              if (MyDay == 20) { 
                  Result = "海の日"; 
              } else; 
          } else; 
      } 
      return Result; 
  } else; 
 
// 8月 //  
  if (MyMonth == 8) { 
      return "";    // (祝日は無い) 
  } else; 
 
   
// 9月 // 
  if (MyMonth == 9) { 
      //第3月曜日(15~21)と秋分日(22~24)が重なる事はない 
      MyAutumnEquinox = prvDayOfAutumnEquinox(MyYear); 
      if (MyDay == MyAutumnEquinox) {    // 1948~2150以外は[99] 
          Result = "秋分の日";           // が返るので、必ず≠になる 
      } else { 
          if (MyYear >= 2003) { 
              NumberOfWeek = Math.floor((MyDay - 1) / 7) + 1; 
              if ((NumberOfWeek == 3) && (MyDate.getDay() == MONDAY)) { 
                  Result = "敬老の日"; 
              } else { 
                  if (MyDate.getDay() == TUESDAY) { 
                      if (MyDay == (MyAutumnEquinox - 1)) { 
                          Result = "国民の休日"; 
                      } else; 
                  } else; 
              } 
          } else { 
              if (MyYear >= 1966) { 
                  if (MyDay == 15) { 
                      Result = "敬老の日"; 
                  } else; 
              } else; 
          } 
      } 
      return Result; 
  } else; 
 
// 10月 // 
  if (MyMonth == 10) { 
      if (MyYear >= 2000) { 
          NumberOfWeek = Math.floor(( MyDay - 1) / 7) + 1; 
          if ((NumberOfWeek == 2) && (MyDate.getDay() == MONDAY)) { 
              Result = "体育の日"; 
          } else; 
      } else { 
          if (MyYear >= 1966) { 
              if (MyDay == 10) { 
                  Result = "体育の日"; 
              } else; 
          } else; 
      } 
      return Result; 
  } else; 
 
// 11月 // 
  if (MyMonth == 11) { 
      if (MyDay == 3) { 
          Result = "文化の日"; 
      } else { 
          if (MyDay == 23) { 
              Result = "勤労感謝の日"; 
          } else { 
              if (MyDate.getTime() == cstSokuireiseiden.getTime()) { 
                  Result = "即位礼正殿の儀"; 
              } else; 
          } 
      } 
      return Result; 
  } else; 
 
// 12月 // 
  if (MyMonth == 12) { 
      if (MyDay == 23) { 
          if (MyYear >= 1989) { 
              Result = "天皇誕生日"; 
          } else; 
      } else; 
      return Result; 
  } else; 
 

 
//=================================================================== 
// 春分/秋分日の略算式は 
// 『海上保安庁水路部 暦計算研究会編 新こよみ便利帳』 
// で紹介されている式です。 
function prvDayOfSpringEquinox(MyYear) 

  var SpringEquinox_ret; 
 
  if (MyYear <= 1947) { 
      SpringEquinox_ret = 99;    //祝日法施行前 
  } else { 
      if (MyYear <= 1979) { 
          // Math.floor 関数は[VBAのInt関数]に相当 
          SpringEquinox_ret = Math.floor(20.8357 +  
            (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4)); 
      } else { 
          if (MyYear <= 2099) { 
              SpringEquinox_ret = Math.floor(20.8431 +  
                (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4)); 
          } else { 
              if (MyYear <= 2150) { 
                  SpringEquinox_ret = Math.floor(21.851 +  
                    (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4)); 
              } else { 
                  SpringEquinox_ret = 99;    //2151年以降は略算式が無いので不明 
              } 
          } 
      } 
  } 
  return SpringEquinox_ret; 

 
//===================================================================== 
function prvDayOfAutumnEquinox(MyYear) 

  var AutumnEquinox_ret; 
 
  if (MyYear <= 1947) { 
      AutumnEquinox_ret = 99; //祝日法施行前 
  } else { 
      if (MyYear <= 1979) { 
          // Math.floor 関数は[VBAのInt関数]に相当 
          AutumnEquinox_ret = Math.floor(23.2588 +  
            (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4)); 
      } else { 
          if (MyYear <= 2099) { 
              AutumnEquinox_ret = Math.floor(23.2488 +  
                (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4)); 
          } else { 
              if (MyYear <= 2150) { 
                  AutumnEquinox_ret = Math.floor(24.2488 +  
                    (0.242194 * (MyYear - 1980)) - Math.floor((MyYear - 1980) / 4)); 
              } else { 
                  AutumnEquinox_ret = 99;    //2151年以降は略算式が無いので不明 
              } 
          } 
      } 
  } 
  return AutumnEquinox_ret; 

 
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 
//_/ CopyRight(C) K.Tsunoda(AddinBox) 2001 All Rights Reserved. 
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 
 
 
//--> 
 附件中第一个就是上面这个代码,感觉很全,而且没有升级什么的,简单测试了哈,没问题,其它几个文件也可以,但感觉不是很好,有升级。或有些功能不太全。