Feb.05, 2019 - 21h32m38s
  • カレンダー(晒)vol.2
とある案件で
久しぶりにphpのカレンダーを
書く事となりました。

せっかくなので今まで
こんなだったカレンダーを…

03.24, 2015 カレンダー(晒)vol.1

…下記ソースの
通り書き換えました。

大きく違うのは
前月と次月の半端日も
表示可能になってます。

…まぁ、

今更感も
溢れんばかりでは
あるのだけれど…。
<?php
class Calendar{

    private $year;
    private $mon;

    function __construct(){
        $this->year  = 0;
        $this->mon  = 0;
    }
    private function chkCalendarDate( $date ){
        //数値の判定
        if( !is_numeric($date) ) return false;
        //正しい桁数の判定
        if( mb_strlen($date)>14 ) return false;
        //正しい日付の判定
        $chk_year = substr( $date, 0, 4 );
        $chk_mon  = abs( substr($date, 4, 2) ); //ゼロサプレス
        if( !checkdate($chk_mon, 1, $chk_year) ) return false;

        return true;
    }
    public function makePerfCalendar( $date ){
        if( !$this->chkCalendarDate( $date ) ){
            $date = date('Y').date('m');
        }
        $this->year = substr( $date, 0, 4 );
        $this->mon = substr( $date, 4, 2 );
        /* 対象月末日の取得 */
        $crnt_eom = date( 'j', mktime(0, 0, 0, 
                                $this->mon+1, 0, $this->year) );
        /* 対象月末日の曜日取得 */
        $crnt_ewday = date( 'w', mktime(0, 0, 0, 
                                   $this->mon, $crnt_eom, $this->year) );
        /* 月末日以降の残り日数(次月)の取得 */
        $next_day = 6 - $crnt_ewday;
        /* ループの最大数を取得 */
        $loop_max = $crnt_eom + $next_day;
        /* ループの最小数(前月の末日の曜日)を取得 */
        $loop_min = date( 'w', mktime(0, 0, 0, 
                               $this->mon,0, $this->year) );
        /* 1日が日曜日の場合 */
        if( $loop_min == 6) $loop_min = -1;

        /* カレンダーのデータを配列に格納 */
        for($i = -$loop_min; $i <= $loop_max; $i++){
            $loop_cal[] = date( 'Ymd', mktime(0, 0, 0, 
                                    $this->mon, $i, $this->year) );
        }
        return $loop_cal;
    }
}
?>