rakutoネット
お問合せ 免責事項 Q&A 掲示板 サイト管理 リンク サイトマップ
HOME > カレンダー

カレンダー


カレンダー

日本の祝祭日を反映させると面倒になるカレンダーです。
連休が取れる様にと、ハッピーマンデーが導入されましたが正直これが曲者です。

祝日の詳細は国民の祝日についてで確認下さい。
法改正があるとそれにあわせて修正しなくてはならないので、祝日定義は別ファイルで持つべきでしょうか。


カレンダーサンプル

カレンダークラスを作る

<?php
/**
 * 曜日の格納番号
 *      $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

<?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>
<?php       foreach ($cals as $row=>$weeks){?>
            <tr>
<?php           foreach ($weeks as $col=>$day){
                    $class = $id2class[$infos[$row][$col]];
?>
                <td style="background-color:<?php echo $class; ?>">
                    <?php echo $day; ?>
                </td>
<?php           }?>
            </tr>
<?php       }?>
        </table>

春分/秋分の日を計算で出すので正式なものではありません。

<<incoude pathを通す
PHP Tips 排他処理>>

PHPリング

@PHP.ring Home
<5 <1 Random List 1> 5>

rktSQLite

  • sourceforge.jp

広告


アマゾン検索

サーチ:
Amazon.co.jpアソシエイト

カテゴリ

  •  Templateエンジンのすすめ Templateエンジンのすすめ
  •  SQLiteをやってみよう SQLiteをやってみよう
  •  SQLite SQLコマンド一覧 SQLiteコマンド一覧
  •  SQLite 管理プログラムSQLite 管理
  •  はじめてのEclipse はじめてのEclipse
  •  PHP SQLiteのTIPS PHP SQLiteのTIPS
  •  サンプル サンプル/ダウンロード
  •  リンク リンク
  •  掲示板 掲示板

メニュー

  •  incoude pathを通す
  •  カレンダー
  •  排他処理
  •  PEAR DB
  •  画像アップロード
  •  プログレスバー
  •  PATH_INFOで拡張子を隠す
  •  トラックバック
  •  PEARのトラックバック
  •  iMagickでGIFアニメ
  •  メモリ上の画像をImageMagickする
  •  暗号化と復号化
  •  strtotime()でmonth処理

キーワード検索

キーワード



最近のTB

  •  2006/03/13さくらのブログに挑戦[rakutoネットブログ]
  •  2006/01/20レーザーチャートの作成方法[脳内研究所]

Summary

  •     ATOM(XML)
  •     RDF(XML)
  •     RSS0.92(XML)
  •     RSS2.0(XML)

Powered by

  •     PHP
  •     Smarty
  •     SQLite
  •     MySQL
Copyright (C) 2005 `rakuto.net' All Rights Reserved.