jsでのカレンダーオブジェクト

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>jsでのカレンダーオブジェクト</title>
  6. <script type="text/javascript">
  7.   /* ==============================================================
  8.    カレンダークラス
  9.   ============================================================== */
  10.   var ClassCalendar = function(argY, argM, argD)
  11.   {
  12.     // ===========================================================
  13.     // メソッド:プライベート
  14.     // ===========================================================
  15.     // 指定がなければ今日
  16.     var now = new Date();
  17.     var year  = argY || now.getFullYear();
  18.     var month = argM || now.getMonth() + 1;
  19.     var day   = argD || now.getDate();
  20.     // 週単位で分割した日にち配列
  21.     var weekAry = new Array();
  22.     var fstWeek = 0;  // 週初めの曜日(0:日曜~6:土曜)
  23.     var fill    = "";  // 日にちの入っていないとこにいれる文字
  24.     // 曜日配列
  25.     var weekLabelAry = new Array("日", "月", "火", "水", "木", "金", "土");
  26.     // ===========================================================
  27.     // パブリックメソッド:プロパティを変更
  28.     // ===========================================================
  29.     /**
  30.      * 年月日をdate()からセット
  31.      * dateData 年月日
  32.      */
  33.     this.setYMDForDate = function(dateData)
  34.     {
  35.       year  = dateData.getFullYear();
  36.       month = dateData.getMonth() + 1;
  37.       day   = dateData.getDate();
  38.       weekAry = new Array(); // 対象となる年月日が変わるなら配列は初期化
  39.     }
  40.     /**
  41.      * 年月日のセット
  42.      * argY, argM, argD 年月日
  43.      */
  44.     this.setYMD = function(argY, argM, argD)
  45.     {
  46.       year  = argY;
  47.       month = argM;
  48.       day   = argD;
  49.       weekAry = new Array(); // 対象となる年月日が変わるなら配列は初期化
  50.     }
  51.     /**
  52.      * 指定数だけ前後する
  53.      * num    nヶ月前 or 後ろ(負の値で前の月、正の値で次の月)
  54.      * target 対象を「y(=n年)、m(=nヶ月)、d(=n日)」
  55.      */
  56.     this.setMoveYMD = function(num, target)
  57.     {
  58.       var target = target || "m";
  59.       var moveMonth = addDate(new Date(year, month-1, day), target, num);
  60.       year  = moveMonth.getFullYear();
  61.       month = moveMonth.getMonth() + 1;
  62.       day   = moveMonth.getDate();
  63.       weekAry = new Array(); // 対象となる年月日が変わるなら配列は初期化
  64.     }
  65.     /**
  66.      * 曜日をセット
  67.      * weekKindAry 曜日のラベル配列
  68.      */
  69.     this.setWeekLabel = function(weekKindAry)
  70.     {
  71.       weekLabelAry = weekKindAry;
  72.     }
  73.     /**
  74.      * スタートなる曜日を決める
  75.      * start   スタートとなる曜日を決める(0:日曜~6:土曜)
  76.      */
  77.     this.setStartWeekDay = function(start)
  78.     {
  79.       start = start || 0;
  80.       if (0 <= parseFloat(start) && parseFloat(start) <= 6) {
  81.         fstWeek = start;
  82.       }
  83.       else {
  84.         // 曜日指定が0~6じゃないなら強制的に0
  85.         fstWeek = 0;
  86.       }
  87.       weekAry = new Array(); // スタートなる曜日が変わるなら配列は初期化
  88.     }
  89.     /**
  90.      * 空白日に埋める文字のセット
  91.      * start   スタートとなる曜日を決める(0:日曜~6:土曜)
  92.      */
  93.     this.setFill = function(addChar)
  94.     {
  95.       addChar = addChar || "";
  96.       fill = addChar;
  97.       weekAry = new Array(); // 区切り文字が変わるなら配列は初期化
  98.     }
  99.     
  100.     // ===========================================================
  101.     // パブリックメソッド
  102.     // ===========================================================
  103.     /**
  104.      * 現在の年月日の各値を取得
  105.      * needVal 欲しい値(y,m,d)
  106.      */
  107.     this.getValueForDate = function (needVal)
  108.     {
  109.       var tempVal = "";
  110.       if (needVal == "y") {
  111.         tempVal = year;
  112.       }
  113.       else if (needVal == "y") {
  114.         tempVal = month;
  115.       }
  116.       else {
  117.         tempVal = day;
  118.       }
  119.       return tempVal;
  120.     }
  121.     /**
  122.      * カレンダー用に変換した週の配列を取得:配列だけ欲しいとき用に。
  123.      * addChar 「1日まで」と「月末以降」を埋める文字
  124.      * start   スタートとなる曜日を決める(0:日曜~6:土曜)
  125.      */
  126.     this.getWeekAry = function (addChar, start)
  127.     {
  128.       if (weekAry.length == 0) {
  129.         this.setStartWeekDay(start);
  130.         this.setFill(addChar);
  131.         dayAryForCalendar();
  132.       }
  133.       return weekAry;
  134.     }
  135.     /**
  136.      * 年月日の書式(yyyy/mm/dd等)を整えて返す
  137.      * type 年月日の書式
  138.      */
  139.     this.convertDateFormat = function(type)
  140.     {
  141.       type = type || "yyyy/mm/dd";
  142.       // いずれ各書式に対応させる予定
  143.       if (type == "yyyy/mm") {
  144.         tempM = convertNumberDigits(2, month);
  145.         convertDate = year + "/" + tempM;
  146.       }
  147.       else {
  148.         // 未対応記述とyyyy/mm/ddの場合
  149.         tempM = convertNumberDigits(2, month);
  150.         tempD = convertNumberDigits(2, day);
  151.         convertDate = year + "/" + tempM + "/" + tempD;
  152.       }
  153.       return convertDate;
  154.     }
  155.     /**
  156.      * カレンダー用の週配列をtableタグにする
  157.      * weekKindAry 週単位にした日にちの配列
  158.      */
  159.     this.makeTableForCalendar = function(weekKindAry)
  160.     {
  161.       weekKindAry = weekKindAry || weekLabelAry;
  162.       if (weekAry.length == 0) {
  163.         dayAryForCalendar();
  164.       }
  165.       var tableTag = "";
  166.       tableTag += '<table class="calendarTable">';
  167.       // 年月
  168.       tableTag += '<caption>';
  169.       tableTag += year + "年" + month + "月";
  170.       tableTag += '</caption>';
  171.       // 曜日:指定された週初めから曜日を並び替え
  172.       useWeekAry = convertWeekLabelOfCalendar(weekKindAry);
  173.       tableTag += '<tr>';
  174.         for (var i=0; i<useWeekAry.length; i++) {
  175.           tableTag += '<th>';
  176.           tableTag += useWeekAry[i];
  177.           tableTag += '</th>';
  178.         }
  179.       tableTag += '</tr>';
  180.       // 日にち
  181.       var styleHol = "";
  182.       var styleTod = "";
  183.       for (var i=0; i<weekAry.length; i++) {
  184.         tableTag += '<tr>';
  185.         for (var j=0; j<weekAry[i].length; j++) {
  186.           calClass = "";
  187.           classHol = "";
  188.           classTod = "";
  189.           if (weekAry[i][j]["num"] == 0) {
  190.             // 日曜
  191.             classHol = 'calHol';
  192.           }
  193.           if (weekAry[i][j]["day"] == day) {
  194.             // 今日
  195.             classTod = ' calTod';
  196.           }
  197.           if (classHol != "" || classTod != "") {
  198.             calClass = ' class="' + classHol + classTod + '"';
  199.           }
  200.           tableTag += '<td' + calClass + '>';
  201.           tableTag += weekAry[i][j]["day"];
  202.           tableTag += '</td>';
  203.         }
  204.         tableTag += '</tr>';
  205.       }
  206.       tableTag += '</table>';
  207.       return tableTag;
  208.     }
  209.     // ===========================================================
  210.     // プライベートメソッド
  211.     // ===========================================================
  212.     /**
  213.      * カレンダー用の配列を返す
  214.      */
  215.     var dayAryForCalendar = function()
  216.     {
  217.       // 「週初めから1日まで」と「月末から週末まで」を文字を埋める
  218.       var dayAry = convertDayOfCalendar();
  219.       // 1週ずつ分割していく
  220.       weekAry = convertWeekOfCalendar(dayAry);
  221.     }
  222.     // 桁数をそろえるために0を埋める
  223.     var convertNumberDigits = function(digit, num)
  224.     {
  225.       var src = new String(num);
  226.       var cnt = digit - src.length;  // 桁数(digit)から足りない文字数を調査
  227.       if (0 < cnt) {
  228.         while (cnt-- > 0) {
  229.           src = "0" + src;
  230.         }
  231.       }
  232.       return src;
  233.     }
  234.     // 指定された曜日を週初めとして空白日を埋める
  235.     var convertDayOfCalendar = function ()
  236.     {
  237.       // 月初と月末のDate()
  238.       var startMonth = new Date(year, month-1, 1);
  239.       var endMonth   = new Date(year, month, 0);
  240.       // 指定された週初めの曜日から週末の曜日を求めておく
  241.       endEeek = (fstWeek != 0) ? fstWeek - 1: 6;
  242.       // カレンダー用に日にちを配列化:
  243.       var DayArray = new Array();
  244.       // 日曜(指定された週初めの曜日)~1日の空白を埋める。
  245.       if (startMonth.getDay() < fstWeek) {
  246.         diffWeekToFst = 7 - Math.abs(startMonth.getDay() - fstWeek);
  247.       }
  248.       else {
  249.         diffWeekToFst = Math.abs(startMonth.getDay() - fstWeek);
  250.       }
  251.       for (i=0; i<diffWeekToFst; i++) {
  252.         DayArray.push(fill);
  253.       }
  254.       // 月初め(1日)~月末までを埋める
  255.       for (i=0; i<endMonth.getDate(); i++) {
  256.         DayArray.push(i+1);
  257.       }
  258.       // 月末~土曜(指定された週末の曜日)の空白を埋める
  259.       if (endMonth.getDay() != endEeek) {
  260.         // 週初めから何日目か
  261.         if (endMonth.getDay() < fstWeek) {
  262.           diffWeekForEnd = 7 - Math.abs(endMonth.getDay() - fstWeek);
  263.         }
  264.         else {
  265.           diffWeekForEnd = Math.abs(endMonth.getDay() - fstWeek);
  266.         }
  267.         // 週末まで何日あるか
  268.         diffWeekFromEnd = 6 - diffWeekForEnd;
  269.         for (i=0; i<diffWeekFromEnd; i++) {
  270.           DayArray.push(fill);
  271.         }
  272.       }
  273.       return DayArray;
  274.     }
  275.     // 年月日に指定された数値を足して返す
  276.     var addDate = function (ymd, target, add)
  277.     {
  278.       var addNum = parseFloat(add);
  279.       var addY = ymd.getFullYear();
  280.       var addM = ymd.getMonth() + 1;
  281.       var addD = ymd.getDate();
  282.       // ymdが月末のときに使う
  283.       var endMonthDay = new Date(addY , addM, 0).getDate();
  284.       var tempD = addD;
  285.       if(target == "y") {
  286.         addY += addNum;
  287.       }
  288.       else if(target == "m") {
  289.         addM += addNum;
  290.       }
  291.       else if(target == "d") {
  292.         addD += addNum;
  293.       }
  294.       // 月末で、年・月を足したとき:月初めに変更して足し、最後に月末をセットする
  295.       if ((target == "y" || target == "m") && tempD == endMonthDay) {
  296.         // 月初めで年月を移動
  297.         dateNoDay = new Date(addY, addM-1, 1);
  298.         // 移動した年月の月末を取得
  299.         var nextY = dateNoDay.getFullYear();
  300.         var nextM = dateNoDay.getMonth() + 1;
  301.         dateLast = new Date(nextY, nextM, 0).getDate();
  302.         // 移動した年月の月末でDate()に変換
  303.         tempDate = new Date(nextY, nextM-1, dateLast);
  304.       }
  305.       else {
  306.         tempDate = new Date(addY , addM-1, addD);
  307.       }
  308.       return tempDate;
  309.     }
  310.     // カレンダー用に週単位で配列にして返す
  311.     var convertWeekOfCalendar = function(dayAry)
  312.     {
  313.       var ary = new Array();
  314.       for (var i=0, j=0, k=fstWeek; i<dayAry.length; i++, k++) {
  315.         j = parseInt(i/7);
  316.         if (i%7 == 0) {
  317.           ary[j] = new Array();
  318.         }
  319.         if (6 < k) {
  320.           k = 0;
  321.         }
  322.         // kが曜日、dayが日にち
  323.         ary[j].push({"num": k, "day": dayAry[i]});
  324.       }
  325.       return ary;
  326.     }
  327.     // 指定されている週初めに合わせて曜日配列を入れ替える
  328.     var convertWeekLabelOfCalendar = function(weekKindAry)
  329.     {
  330.       var ary = new Array();
  331.       for (var i=0, j=fstWeek; i<7; i++, j++) {
  332.         if (6 < j) {
  333.           j = 0;
  334.         }
  335.         ary.push(weekKindAry[j]);
  336.       }
  337.       return ary;
  338.     }
  339.   }
  340. </script>
  341. <style type="text/css">
  342. .calendarTable{
  343.   border-collapse:collapse;
  344.   margin:0;
  345. }
  346. .calendarTable caption{
  347.   text-align:left;
  348.   padding:3px 1px;
  349. }
  350. .calendarTable th{
  351.   background:#ffffcc;
  352.   padding:2px;
  353.   text-align:center;
  354.   border:1px solid #ccc;
  355. }
  356. .calendarTable td{
  357.   background:#fff;
  358.   padding:2px;
  359.   text-align:center;
  360.   border:1px solid #ccc;
  361. }
  362. .calendarTable .calHol{
  363.   color:#ff0000;
  364. }
  365. .calendarTable .calTod{
  366.   background:#ccffff;
  367.   font-weight:bold;
  368. }
  369. </style>
  370. </head>
  371. <body>
  372. <h1>jsでのカレンダーオブジェクト</h1>
  373. 使ってるCSSのクラスはテーブルタグに「calendarTable」、日曜に「calHol」、指定日に「calTod」。<br />
  374. <br />
  375. <script type="text/javascript">
  376.   // デフォルト:インスタンス作成
  377.   var defaultCal = new ClassCalendar();
  378.   
  379.   document.write("■デフォルトのまま単純に出力する<br />");
  380.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  381.   document.write("<br />");
  382.   
  383.   document.write("■空白日を「-」にして出力<br />");
  384.   defaultCal.setFill("-"); // 空白日の変更
  385.   tag = defaultCal.makeTableForCalendar(); // テーブルタグに変換したヤツが欲しいならコレ
  386.   document.write(tag + "<br />");
  387.   document.write("<br />");
  388.   defaultCal.setFill(""); // 空白日をもとに戻しておく。
  389.   // 配列だけが欲しいなら下記でOK
  390.   // ary = defaultCal.getWeekAry();
  391.   document.write("■第4週までしかない月(2012/2/1指定):曜日を変更(以降、ずっと同じ記述にするならsetWeekLabel()で変更しておく)<br />");
  392.   defaultCal.setYMD(2015,2,1); // 年月を指定
  393.   document.write(defaultCal.makeTableForCalendar(new Array("sun", "mon", "tue", "wed", "thu", "fri", "sat")) + "<br />");
  394.   document.write("<br />");
  395.   document.write("■第6週まである月(2012/12/31指定)<br />");
  396.   defaultCal.setYMD(2012,12,31);
  397.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  398.   document.write("<br />");
  399.   document.write("■最後に指定した年月日から1か月後<br />");
  400.   defaultCal.setMoveYMD(1); // nヶ月後、nヶ月前を指定
  401.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  402.   document.write("<br />");
  403.   document.write("■2012/11/11から1か月後(年を超えない場合)<br />");
  404.   defaultCal.setYMD(2012,11,11);
  405.   defaultCal.setMoveYMD(1);
  406.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  407.   document.write("<br />");
  408.   document.write("■最後に指定した年月日から2か月前<br />");
  409.   defaultCal.setMoveYMD(-2);
  410.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  411.   document.write("<br />");
  412.   document.write("■最後に指定した年月日から3日後の月<br />");
  413.   defaultCal.setMoveYMD(3, "d");
  414.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  415.   document.write("<br />");
  416.   document.write("■2012/3/2の3日前の月<br />");
  417.   defaultCal.setYMD(2012,3,2);
  418.   defaultCal.setMoveYMD(-3, "d");
  419.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  420.   document.write("<br />");
  421.   document.write("■最後に指定した年月日で、月曜スタートで空白日を「-」にする<br />");
  422.   defaultCal.setFill("-");       // 空白日の変更
  423.   defaultCal.setStartWeekDay(1); // 月曜スタートに変更
  424.   document.write(defaultCal.makeTableForCalendar() + "<br />");
  425.   document.write("<br />");
  426.   defaultCal.setFill("");        // 空白日をもとに戻しておく。
  427.   defaultCal.setStartWeekDay(0); // 日曜スタートをもとに戻しておく。
  428.   document.write("■年月日を表示<br />");
  429.   document.write(defaultCal.convertDateFormat() + "<br />");
  430.   document.write("<br />");
  431. </script>
  432. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  433. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  434. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  435. </div>
  436. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  437. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  438. </div>
  439. </body>
  440. </html>