カレンダー
日本の祝祭日を反映させると面倒になるカレンダーです。連休が取れる様にと、ハッピーマンデーが導入されましたが正直これが曲者です。
祝日の詳細は国民の祝日についてで確認下さい。
法改正があるとそれにあわせて修正しなくてはならないので、祝日定義は別ファイルで持つべきでしょうか。
カレンダーサンプル
カレンダークラスを作る
/** * 曜日の格納番号 * $calendar[$week][RKT_SUN] * @const RKT_SUN 日 * @const RKT_MON 月 * @const RKT_TUE 火 * @const RKT_WED 水 * @const RKT_THU 木 * @const RKT_FRI 金 * @const RKT_SAT 土 */ define('RKT_SUN', 0); define('RKT_MON', 1); define('RKT_TUE', 2); define('RKT_WED', 3); define('RKT_THU', 4); define('RKT_FRI', 5); define('RKT_SAT', 6); /** * 平日・休日/祝日・土曜日フラグ * $info[$week][RKT_MON] = RKT_HOLIDAY; * @const RKT_WEEKDAY 月~金曜 * @const RKT_HOLIDAY 日曜祝日 * @const RKT_SATURDAY 土曜日 * @const RKT_TODAY 今日 */ define('RKT_WEEKDAY', 0); define('RKT_HOLIDAY', 1); define('RKT_SATURDAY', 2); define('RKT_TODAY', 3); /** * カレンダー生成クラス * * @author 高橋 裕志郎 <yujiro@rakuto.net> * @package RKT_calendar * @access public * @version 0.1 */ class RKT_calendar { /** * 日付 年 * @var integer */ var $year = 2004; /** * 日付 月 * @var integer */ var $month = 1; /** * 日付 日 * @var integer */ var $day = 1; /** * タイムスタンプ * @var long */ var $timestamp = 0; /** * 一日の曜日 * @var integer */ var $start = 0; /** * 月の最終日 * @var integer */ var $last = 0; /** * 週の数 * @var integer */ var $num_weeks = 0; /** * カレンダー * @var array */ var $calendar = array(); /** * カレンダー情報 * @var array */ var $info = array(); /** * 日付の指定 * * @access public * @param integer $year 年 * @param integer $month 月 * @param integer $day 日にち */ function RKT_calendar($year,$month,$day) { $this->year = $year; $this->month = $month; $this->day = $day; $this->timestamp = mktime(0,0,0,$month,$day,$year); $this->start = intval(date('w',$this->timestamp)); $this->last = intval(date('t',$this->timestamp)); $this->num_weeks = intval((($this->start + $this->last) / 7) + 0.9); } /** * 指定月の日にちを2次元配列に格納しカレンダーにする * * @access public * @return array 2次元配列のカレンダー */ function getCalendar() { $day = 1; $linecount = 0; $start = $this->start; for ($row=0; $row<$this->num_weeks; $row++){ /* 一週間毎の初期化 */ $this->calendar[$row] = array('','','','','','',''); /* 休日用配列の初期化 */ $this->info[$row] = array( RKT_HOLIDAY,RKT_WEEKDAY,RKT_WEEKDAY, RKT_WEEKDAY,RKT_WEEKDAY,RKT_WEEKDAY, RKT_SATURDAY); /* 日数を設定 */ for ($col=$start; $col<7 && $day<=$this->last; $col++){ $this->calendar[$row][$col] = $day++; } $start = 0; } return ($this->calendar); } /** * 2次元配列のカレンダーでの今日の位置を取得 * * @access public * @return array 今日の位置 */ function getTodayPos() { $pos = $this->start + $this->day - 1; $week = intval($pos/7); $yobi = $pos - ($week*7); return (array('week'=>$week,'yobi'=>$yobi)); } /** * 春分/秋分の日を設定する * * @access private * @param array $h_days 休日情報 */ function set_equinox(&$h_days) { $year = $this->year; $month = $this->month; if ($month != 3 && $month != 9){ return; } $difference = intval(($year - 1980)/4); $const = array( 3=>20.8431, 9=>23.2488 ); $equinox = $const[$month] + 0.242194 * ($year - 1980) - $difference; array_push($h_days[$month],(int)$equinox); } /** * 指定月の休日/祝日などを2次元配列に格納する * * @access public * @return array 休日/祝日などの情報 */ function getInformation() { $month = $this->month; $h_days = array( 1=> array(1), // 元旦 2=> array(11), // 建国記念日 3=> array(), 4=> array(29), // みどりの日 5=> array(3,4,5), // 憲法記念日,こどもの日 6=> array(), 7=> array(), 8=> array(), 9=> array(), 10=> array(), 11=> array(3,23), // 文化の日,勤労感謝の日 12=> array(23) // 天皇誕生日 ); $this->set_equinox($h_days); // 固定祝日 foreach ($h_days[$month] as $h_day){ $pos = $this->start + ($h_day -1); $week = intval($pos/7); $yobi = $pos - ($week*7); $this->info[$week][($yobi ? $yobi:RKT_MON)] = RKT_HOLIDAY; } // ハッピーマンデー $mdct = ($this->start > 1)? 1:0; // 最初の月曜日が第1週にあるか switch ($month){ case 1: $mdct += 1; // 第2月曜 成人の日 $this->info[$mdct][RKT_MON] = RKT_HOLIDAY; break; case 7: $mdct += 2; // 第3月曜 海の日 $this->info[$mdct][RKT_MON] = RKT_HOLIDAY; break; case 9: $mdct += 2; // 第3月曜 敬老の日 $this->info[$mdct][RKT_MON] = RKT_HOLIDAY; break; case 10: $mdct += 1; // 第2月曜 体育の日 $this->info[$mdct][RKT_MON] = RKT_HOLIDAY; break; default: break; } return ($this->info); } }// RKT_calendarの終了
calendar.php
/* =-=- モジュール等の読み込み -=-= */ require_once('rkt_calendar.php'); $id2class = array( RKT_WEEKDAY => "#C9D1F4", RKT_HOLIDAY => "#FFAAAA", RKT_SATURDAY =>"#AAAAFF", ); $objcal = new RKT_calendar(2004,1,1); $cals = $objcal->getCalendar(); $infos = $objcal->getInformation(); /* 今日を強調する */ $pos = $objcal->getTodayPos(); $cals[$pos['week']][$pos['yobi']] = "<strong>{$cals[$pos['week']][$pos['yobi']]}</strong>"; <table> <tr> <td style="background-color:#FFAAAA">日</td> <td style="background-color:#C9D1F4">月</td> <td style="background-color:#C9D1F4">火</td> <td style="background-color:#C9D1F4">水</td> <td style="background-color:#C9D1F4">木</td> <td style="background-color:#C9D1F4">金</td> <td style="background-color:#AAAAFF">土</td> </tr> foreach ($cals as $row=>$weeks){ <tr> foreach ($weeks as $col=>$day){ $class = $id2class[$infos[$row][$col]]; <td style="background-color: echo $class; "> echo $day; </td> } </tr> } </table>
春分/秋分の日を計算で出すので正式なものではありません。
