ver.1サポートサイト

カレンダー

最終更新日:2020年11月20日

HTML部分

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<style type="text/css">
/* カレンダーの枠のスタイル */
table.calendar_table
{
border-collapse: collapse;
border-top : solid 1px #999999;
border-left: solid 1px #999999;
}
/* ヘッダの平日スタイル */
table.calendar_table th.calendar_weekday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
background-color:#ffffff;
color: #999999;
}
/* ヘッダの土曜日スタイル */
table.calendar_table th.calendar_saturday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
background-color:#ffffff;
color: #0000ff;
}
/* ヘッダの日曜日スタイル */
table.calendar_table th.calendar_sunday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
background-color:#ffffff;
color: #ff0000;
}
/* 日付の平日スタイル */
table.calendar_table td.calendar_weekday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
height: 60px;
background-color:#ffffff;
color: #999999;
}
/* 日付の土曜日スタイル */
table.calendar_table td.calendar_saturday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
height: 60px;
background-color:#ffffff;
color: #0000ff;
}
/* 日付の日曜日スタイル */
table.calendar_table td.calendar_sunday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
height: 60px;
background-color:#ffffff;
color: #ff0000;
}
/* 日付の祝日スタイル */
td.calendar_holiday
{
padding: 5px;
text-align:center;
border-collapse: collapse;
border-right : solid 1px #999999;
border-bottom: solid 1px #999999;
width : 40px;
height: 60px;
background-color:#ffffff;
color: #ff0000;
}
/* 日付の属性スタイル */
table.calendar_table .attr
{
margin-top: 5px;
background-color: #ffaaaa;
color: #ffffff;
font-size: 12px;
width : 100%;
height: 20px;
line-height: 20px;
}
/* 祝日スタイル */
table.calendar_table .holidayString
{
margin-top: 5px;
color: #ff0000;
font-size: 10px;
width : 100%;
height: 20px;
line-height: 20px;
}
</style>
</head>
<body>
<?php // <!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=ON NAME=CALENDAR_TEST --> ?>
<?php
// カレンダー作成
$calendar = new Calendar();
//$calendar->setStartMonday();
// 属性を登録 (日付、キーワード、値)する。属性を増やす場合は getBodyHtml()を上書きする
$calendar->setAttributeByDateTime("2012-02-01", "attr", "満");
$calendar->setAttributeByDateTime("2012-02-02", "attr", "空");
// 出力
echo "2月\n";
echo $calendar->generate(2012, 2);
?>
</body>
</html>

PHP部分

クラス名:Calendar

<?php
// カレンダー
class Calendar
{
private $wdays = array("日", "月", "火", "水", "木", "金", "土"); // 曜日
private $startMonday = false; // 月曜日スタートフラグ
private $m_head = array(); // ヘッダ
private $m_data = array(); // 日付
private $m_attr = array(); // 属性
public function __construct() // コンストラクタ
{
$this->init();
}
public function setStartMonday() // 月曜日から始める
{
$this->startMonday = true;
}
// カレンダーをHTMLで取得します。
public function generate($_year = null, $_month = null)
{
$this->create($_year, $_month);
$ret = "<table cellpadding=\"0\" padding=\"0\" class=\"calendar_table\">"; // tableタグ
$ret .= $this->getHeaderHtml(); // カレンダーの曜日部分
$ret .= $this->getBodyHtml(); // カレンダーの本体部分
$ret .= "</table>";
return $ret;
}
// カレンダーをHTMLで取得します。
public function getHeaderHtml()
{
$ret = "<tr>";
foreach ($this->m_head as $day) {
// th 開始タグ
if ($day->isSaturday()) {
$ret .= "<th class=\"calendar_saturday\">";
} else if ($day->isSunday()) {
$ret .= "<th class=\"calendar_sunday\">";
} else {
$ret .= "<th class=\"calendar_weekday\">";
}
// 曜日
$ret .= $day->getDay();
// th 終了タグ
$ret .= "</th>";
}
$ret .= "</tr>";
return $ret;
}
// カレンダーをHTMLで取得します。
public function getBodyHtml()
{
$ret = "";
// 1〜31日まで
foreach ($this->getDate() as $week) {
$ret .= "<tr>";
foreach ($week as $day) {
// 祝日
$holidayName = $day->getHolidayName();
// td 開始タグ。スタイルシートも設定する
if ($day->isSunday() || $holidayName = null) {
$ret .= "<td class=\"calendar_sunday\">";
} else if ($day->isSaturday()) {
$ret .= "<td align=\"center\" class=\"calendar_saturday\">";
} else {
$ret .= "<td class=\"calendar_weekday\">";
}
$ret .= "<div>" . $day->getDay() . "</div>"; // 日付
$ret .= "<div class=\"holidayString\">" . $day->getHolidayName() . "</div>"; 祝日
if ($day->getDay()) { // 属性(キー:attr) があれば追加します
$ret .= "<div class=\"attr\">" . $day->getAttribute("attr") . "</div>";
}
$ret .= "</td>"; // td 閉じタグ
}
$ret .= "</tr>";
}
return $ret;
}
// 日付データを返します。
public function getDate()
{
return $this->m_data;
}
// 日付に属性情報を登録します。
// @param string 日付(1〜31)
// @param string キー
// @param string 値
public function setAttributeByDay($_day, $_key, $_val)
{
$this->m_attr[$_day] = array($_key => $_val);
}
// YYYY-MM-DD [xx:xx:xx] 形式のデータからDDを取り出して属性情報を登録。
// 区切り文字のハイフンは、数字以外の文字であれば何でも使用可。
// @param string 日付(yyyy-mm-dd xx:xx:xx)
// @param string キー
// @param string 値
public function setAttributeByDateTime($_date, $_key, $_val)
{
$tmp = preg_split("/[^\d]+/", $_date);
$cnt = count($tmp);
if ($cnt < 3) {
return;
}
$day = (int)$tmp[2];
$this->setAttributeByDay($day, $_key, $_val);
}
// 日付データを作成します。
// @param string 年
// @param string 月
public function create($_year = "", $_month ="" )
{
$this->init();
$weekIndex = 0;
if ($_year == null && $_month == null) {
$_year = (int)date("Y");
$_month = (int)date("n");
}
// 月末の日を取得します
$last_day = date("j", mktime(0, 0, 0, $_month + 1, 0, $_year));//前月の末日として計算
// ヘッダ
$index = ($this->startMonday) ? 1 : 0;
for ($i = 0; $i < 7 ; ++$i) {
array_push($this->m_head, new CalendarCell($this->wdays[$index], (int)$index));
$index = ($index == 6) ? 0 : $index + 1;
}
// 1日〜$last_day日まで繰り返してカレンダーを作成します
for ($i = 1; $i <= $last_day ; ++$i) {
$wday = (int)date("w", mktime(0, 0, 0, $_month, $i, $_year));
$index = $wday; //日曜日開始パターン
// 月曜日開始パターン
if ($this->startMonday) {
$index = ($wday == 0) ? 6 : $index - 1;
}
// 第N週を調べる(0が第1週)
$wdayIndex = 0;
for ($w = 0 ; $w < count($this->m_data) ; ++$w) {
if ($wday === $this->m_data[$w][$index]->getDayOfWeek()) {
++$wdayIndex;
}
}
// 祝日の名前
$holidayName = $this->getHolidayName($_year, $_month, $i, $wday, $wdayIndex);
// セルが足りないので補完
if (isset($this->m_data[$weekIndex])) {
$this->m_data[$weekIndex] = array();
for ($d = 0 ; $d < 7 ; ++$d) {
array_push($this->m_data[$weekIndex], new CalendarCell());
}
}
$this->m_data[$weekIndex][$index] = new CalendarCell($i, $wday, $this->m_attr[$i], $holidayName);
if ($index == 6) {
++$weekIndex;
}
}
}
// 日付データテーブルを初期化
private function init()
{
$this->m_head = array();
$this->m_data = array(array(), array(), array(), array(), array());
for ($i = 0 ; $i < count($this->m_data) ; ++$i) {
for ($d = 0 ; $d < 7 ; ++$d) {
array_push($this->m_data[$i], new CalendarCell());
}
}
}
// 祝日であれば祝日名を返します。(この関数の製作年である2012年以降に対応しています)
// @param int 年
// @param int 年
// @param int 日
// @param int 曜日(0-6)
// @param int 第N週 (0-4)
private function getHolidayName($_year, $_month, $_day, $_wday, $_wdayIndex)
{
$name = "";
if ($_month == 1) {
if ($_day === 1) { $name = "元旦"; }
else if ($_day === 2 && $_wday === 1) { $name = "振替休日"; }
else if ($_wday === 1 && $_wdayIndex === 1) { $name = "成人の日"; } //第2月曜日
} else if ($_month == 2) {
if ($_day === 11) { $name = "建国記念の日"; }
else if ($_day === 12 && $_wday === 1) { $name = "振替休日"; }
} else if ($_month == 3) {
$x = (int)abs(20.8431 + 0.242194// ($_year - 1980) - (int)abs(($_year - 1980) / 4));
if ($x === $_day) { $name = "春分の日"; }
else if ($_day === ($x+1) && $_wday === 1) { $name = "振替休日"; }
} else if ($_month == 4) {
if ($_day === 29) { $name = "昭和の日"; }
else if ($_day === 30 && $_wday === 1) { $name = "振替休日"; }
} else if ($_month == 5) {
if ($_day === 3) { $name = "憲法記念日"; }
else if ($_day === 4) { $name = "みどりの日"; }
else if ($_day === 5) { $name = "こどもの日"; }
else if ($_day === 6 && $_wday === 1) { $name = "振替休日"; }
else if ($_day === 6 && $_wday === 2) { $name = "振替休日"; }
else if ($_day === 6 && $_wday === 3) { $name = "振替休日"; }
} else if ($_month == 6) {
// none
} else if ($_month == 7) {
if ($_wday === 1 && $_wdayIndex === 2) { $name = "海の日"; } //第3月曜日
} else if ($_month == 8) {
// none
} else if ($_month == 9) {
$x = (int)abs(23.2488 + 0.242194// ($_year - 1980) - (int)abs(($_year - 1980) / 4));
if ($x === $_day) { $name = "秋分の日"; }
else if ($_day === ($x+1) && $_wday === 1) { $name = "振替休日"; }
else if ($_wday === 1 && $_wdayIndex === 2) { $name = "敬老の日"; } //第3月曜日
else if (($_day + 1) === $x && ($_wday + 1) === 3) { $name = "国民の休日"; } //2150年までは翌日の秋分の日が水曜なら国民の休日
} else if ($_month == 10) {
if ($_wday === 1 && $_wdayIndex === 1) { $name = "体育の日"; } //第2月曜日
} else if ($_month == 11) {
if ($_day === 3) { $name = "文化の日"; }
else if ($_day === 4 && $_wday === 1) { $name = "振替休日"; }
else if ($_day === 23) { $name = "勤労感謝の日"; }
else if ($_day === 24 && $_wday === 1) { $name = "振替休日"; }
} else if ($_month == 12) {
if ($_day === 23) { $name = "天皇誕生日"; }
else if ($_day === 24 && $_wday === 1) { $name = "振替休日"; }
}
return $name;
}
}
?>

クラス名:CalendarCell

<?php
// カレンダーの1日分のデータを保持するクラス
class CalendarCell
{
// カレンダーの日付データ
private $m_data = "";
// カレンダーの曜日データ
private $m_dayofweek = "";
// 祝日の名前
private $m_holidayName = "";
// カレンダーの属性データ
private $m_attr = array();
// コンストラクタ
// @param int 日付 (1〜31の整数)
// @param int 曜日 (0〜6の整数で0が日曜日)
public function __construct($_date = null, $_wday = null, $_attr = null, $_holiday = null)
{
$this->m_data = ($_date === null) ? "" : $_date;
$this->m_dayofweek = ($_wday === null) ? "" : $_wday;
$this->m_attr = ($_attr === null) ? array() : $_attr;
$this->m_holidayName = ($_holiday === null) ? "" : $_holiday;
}
// 指定した日付がこのインスタンスの日付と等しければtrueを返します。
// @param string 日付
// @return boolean
public function equals($_val)
{
return ($this->m_data === $_val);
}
// このインスタンスの日付が土曜日ならtrueを返します。
// @return boolean
public function isSaturday()
{
return ($this->m_dayofweek === 6);
}
// このインスタンスの日付が日曜日ならtrueを返します。
// @return boolean
public function isSunday()
{
return ($this->m_dayofweek === 0);
}
// このインスタンスの日付を返します。
// @return int
public function getDay()
{
return $this->m_data;
}
// このインスタンスの曜日を返します。
// @return int
public function getDayOfWeek()
{
return $this->m_dayofweek;
}
// このインスタンスの祝日名を返します。
// @return string
public function getHolidayName()
{
return $this->m_holidayName;
}
// このインスタンスの属性を返します。
// @param string キー
// @return string 値
public function getAttribute($_key)
{
return $this->m_attr[$_key];
}
}
?>