週間カレンダー作ってみました。それでdate関数は全く使わず、DateTimeクラス関数類で作成しました。
2038年問題もあるのでゆくゆくはコチラの関数主流になるし、習慣化するためこちらで作成。
でも使いやすいんですよねdate,mktime,strtotime,time関数って。いままで使ってきた関数なので慣れもあってちょろっと書いて使えるのがいいですね~。今のところ主流ですが、使い勝手はDateTimeがいいかも。わりあいタイムスタンプにしなくてもよさげな場合があるんで、日付を直感的に使えるのが良いかも。
スポンサーリンク
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | //本日取得 function getToday($date = 'Y-m-d') { $today = new DateTime(); return $today->format($date); } //本日かどうかチェック function isToday($year, $month, $day) { $today = getToday('Y-n-j'); if ($today == $year."-".$month."-".$day) { return true; } return false; } //今週の日曜日の日付を返す function getSunday() { $today = new DateTime(); $w = $today->format('w'); $ymd = $today->format('Y-m-d'); $next_prev = new DateTime($ymd); $next_prev->modify("-{$w} day"); return $next_prev->format('Ymd'); } //今週月曜日の日付を返す function getMonday() { $today = new DateTime(); $w = $today->format('w'); $ymd = $today->format('Y-m-d'); if ($w == 0) { $d = 6; } else { $d = $w - 1 ; } $next_prev = new DateTime($ymd); $next_prev->modify("-{$d} day"); return $next_prev->format('Ymd'); } //N日(週)+か-する関数 function getNthDay($year, $month, $day, $n) { $next_prev = new DateTime($year.'-'.$month.'-'.$day); $next_prev->modify($n); return $next_prev->format('Ymd'); } //週間カレンダー表示 if (isset($_GET['date'])) { //年月日取得 $year_month_day = $_GET['date']; } else { //今週日曜日取得 $year_month_day = getSunday(); } //年月日に変数で取得 $year = substr($year_month_day, 0, 4); $month = substr($year_month_day, 4, 2); $day = substr($year_month_day, 6, 2); $month = sprintf("%01d", $month); $day = sprintf("%01d", $day); $next_week = getNthDay($year, $month, $day, '+1 week'); $pre_week = getNthDay($year, $month, $day, '-1 week'); $table = NULL; //週間の日付出力 for ($i = 0; $i < 7; $i++) { $ymd = getNthDay($year, $month, $day, '+'.$i.' day'); $y = substr($ymd, 0, 4); $m = substr($ymd, 4, 2); $d = substr($ymd, 6, 2); $n = sprintf("%01d", $m); $j = sprintf("%01d", $d); $t = $j.'日'; if (isToday($y, $n, $j)){ $table .= '<td class="today">'.$t.'</td>'.PHP_EOL; } else { $table .= '<td>'.$t.'</td>'.PHP_EOL; } } |
それで表示プログラムで終わり!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <table class="cal"> <tr> <th colspan="2"><a href="<?php $_SERVER['SCRIPT_NAME'];?>?date=<?php echo $pre_week;?>">« 前週</a></td> <th colspan="3"><?php echo $year;?> 年 <?php echo $month;?> 月</td> <th colspan="2"><a href="<?php $_SERVER['SCRIPT_NAME'];?>?date=<?php echo $next_week;?>">次週 »</a></td> </tr> <tr> <td>日</td> <td>月</td> <td>火</td> <td>水</td> <td>木</td> <td>金</td> <td>土</td> </tr> <tr> <?php echo $table;?> </tr> </table> |
意外に手間だったなー、date関数使うともっとラクだけど、DateTimeクラスは自分用のラッパークラス作っておけばかなりラクになりますよ。
因みに月曜日始まりにしたい場合は$year_month_day = getSunday()を$year_month_day = getMonday()にかえてテーブルの曜日変えればよいだけっす。因みにここには書いてありませんが、エスケープ処理は必須ですよ!