【PHP】営業日カレンダー表示用PHPクラスを作ってみた

営業日カレンダー

営業日カレンダーを作ることになりそうだったのでサンプルを作ってみた。

まだまだ改善の余地はある。ってか動かなかったらごめんなさい。

ソースコード

Gistに上げました。

好きに使ってください(MITライセンス)。

動作するかどうかは保証しません、動作によって色んなことが起きても自己責任でどうぞ。


<?php
class business_calendar {
const WEEK = 7; // 1 week is 7 days
// holiday_of_week flag index
const IDX_SUNDAY = 0;
const IDX_MONDAY = 1;
const IDX_TUESDAY = 2;
const IDX_WEDNESDAY = 3;
const IDX_THURSDAY = 4;
const IDX_FRIDAY = 5;
const IDX_SATURDAY = 6;
protected $year = "";
protected $month = "";
protected $calendar = array();
protected $holiday_of_week = array();
protected $exception_holidays = array();
protected $exception_business_days = array();
function __construct($year, $month) {
$this->year = $year;
$this->month = $month;
$this->set_holiday_of_week();
$this->clear_exception_holidays();
$this->clear_exception_business_days();
}
function __destruct() {
}
/**
* 毎週の曜日休みを設定する
*/
public function set_holiday_of_week($sunday = false , $monday = false , $tuesday = false , $wednesday = false , $thursday = false , $friday = false , $saturday = false ) {
$holiday_of_week = array();
$holiday_of_week[self::IDX_SUNDAY] = $sunday;
$holiday_of_week[self::IDX_MONDAY] = $monday;
$holiday_of_week[self::IDX_TUESDAY] = $tuesday;
$holiday_of_week[self::IDX_WEDNESDAY] = $wednesday;
$holiday_of_week[self::IDX_THURSDAY] = $thursday;
$holiday_of_week[self::IDX_FRIDAY] = $friday;
$holiday_of_week[self::IDX_SATURDAY] = $saturday;
$this->holiday_of_week = $holiday_of_week;
}
/**
* 休日・稼働日の定義をクリアする
*/
protected function clear_days(&$array_target) {
$array_target = array();
}
public function clear_exception_holidays() {
$this->clear_days($this->exception_holidays);
}
public function clear_exception_business_days() {
$this->clear_days($this->exception_business_days);
}
/**
* 休日・稼働日の定義を追加する
*/
protected function add_day($year,$month,$day,&$array_target) {
$date = date('Ymd', mktime(0,0,0,$month,$day,$year));
if(!in_array($date,$array_target)) {
$array_target[] = $date;
}
}
public function add_exception_holiday($year,$month,$day) {
$this->add_day($year, $month, $day, $this->exception_holidays);
}
public function add_exception_business_day($year,$month,$day) {
$this->add_day($year, $month, $day, $this->exception_business_days);
}
/**
* 休日・稼働日の定義を削除する
*/
protected function remove_day($year,$month,$day,&$array_target) {
$date = date('Ymd', mktime(0,0,0,$month,$day,$year));
$key = array_search($date,$array_target);
if( $key !== false ) {
array_splice($array_target, $key+1, 1);
}
}
public function remove_exception_holidays($year,$month,$day) {
$this->remove_day($year, $month, $day, $this->exception_holidays);
}
public function remove_exception_business_days($year,$month,$day) {
$this->remove_day($year, $month, $day, $this->exception_business_days);
}
/**
* 稼働日チェック
*/
protected function is_businesday_day($day) {
$time = mktime(0,0,0,$this->month,$day,$this->year);
$week_day = (int)date("w",$time);
$date = date("Ymd",$time);
if( in_array( $date, $this->exception_business_days ) ) {
return true;
}
if( in_array( $date, $this->exception_holidays ) ) {
return true;
}
if( isset($this->holiday_of_week[$week_day]) && $this->holiday_of_week[$week_day]) {
return false;
}
return true;
}
/**
* 休日チェック
*/
protected function is_holiday($day) {
$time = mktime(0,0,0,$this->month,$day,$this->year);
$week_day = (int)date("w",$time);
$date = date("Ymd",$time);
if( in_array( $date, $this->exception_business_days ) ) {
return false;
}
if( in_array( $date, $this->exception_holidays ) ) {
return true;
}
if( isset($this->holiday_of_week[$week_day]) && $this->holiday_of_week[$week_day]) {
return true;
}
return false;
}
/**
* カレンダーの値を計算
*/
protected function calc_calendar() {
$first_day = mktime(0,0,0,$this->month,1,$this->year);
$start_offset = (int)date("w",$first_day);
$month_days = (int)date("t",$first_day);
$calendar = array();
$day = 1;
while($day < $month_days):
$row = array();
for($i = 0; $i < self::WEEK; $i++) {
if( ( $day == 1 && $i < $start_offset ) || $day > $month_days) {
$row[] = array("day" => "", "is_holiday" => false);
continue;
}
$holiday_flag = $this->is_holiday($day);
$date = date("Y年m月d日", mktime(0,0,0,$this->month,$day,$this->year));
$day_data = array(
"day" => $day,
"is_holiday" => $holiday_flag,
"value" => $date
);
$row[] = $day_data;
$day++;
}
$calendar[] = $row;
endwhile;
// var_dump($calendar);
$this->calendar = $calendar;
}
/**
* カレンダー出力
*/
public function render() {
$this->calc_calendar();
echo $this->get_table_header();
echo $this->get_table_body();
echo $this->get_table_footer();
}
protected function get_table_header() {
$date = date("Y年m月", mktime(0,0,0,$this->month,1,$this->year));
$html = '<table class="calendar">
<caption>' . $date . '</caption>
<thead>
<tr>
<th class="calendar-day-sunday">日</th>
<th class="calendar-day-monday">月</th>
<th class="calendar-day-tuesday">火</th>
<th class="calendar-day-wednesday">水</th>
<th class="calendar-day-thursday">木</th>
<th class="calendar-day-friday">金</th>
<th class="calendar-day-saturday">土</th>
</tr>
</thead>
<tbody>';
return $html;
}
protected function get_table_body() {
$html = "";
foreach ($this->calendar as $row ) {
$html .= "<tr>";
foreach ($row as $day) {
$html .= $this->get_table_cell($day);
}
$html .= "</tr>";
}
return $html;
}
protected function get_table_cell($day) {
if(empty($day["day"])) {
return "<td class='calendar-cell-empty'></td>";
}
$html = "";
$td_class = 'calendar-cell';
$td_class .= $day["is_holiday"] ? ' calendar-cell-holiday ' : ' calendar-cell-business-day ';
$html .= "<td class='{$td_class}'>";
$html .= '<div>' . $day["day"] . '</div>';
if( $day["is_holiday"] ) {
// 休日
$html .= "休";
} else {
// 営業日
$html .= "営業";
}
$html .= "</td>";
return $html;
}
protected function get_table_footer() {
return '</tbody>
</table>';
}
}

ライセンス

MIT license

使い方

ソースコードをダウンロードしてインクルード頂いた後、こんな感じで使って頂ければと思います。

まとめ

プログラム作るの面白かった。

仕事では未だ使っていないので、動かなかったらごめんなさい。



【開催報告】Mautic Meetup Nagoya #6 緊急企画 ファウンダー David Hurley 氏来日セミナー

開催してからだいぶ時間が経ってしまいました(^_^;) 当日の様子や資料をブログします。

Mautic Meetup Nagoya #6 緊急企画 ファウンダー David Hurley 氏来日セミナー開催しました

当日の内容は以下の通りです。

台風が直撃したため、参加者は激減しましたが、David Hurley 氏のセッションが間近で聞けて、非常に充実したセミナーでした。

開催日

9月20日  19:00~

TIMETABLE / スケジュール

– 18:30 開場・受付開始 / Door open

– 19:00 開会のあいさつ / Opening

– 19:05 マーケティングオートメーション & Mautic とは / What is marketing automation and what is Mautic.

– 19:45 名古屋の事例紹介 / Case Study from Nagoya

– 20:00 David Hurley: Mauticとマーケティングの未来 / The Future of Mautic & Marketing

– 21:15 会場を移動し任意の参加者により懇親会 / After party at different venue.

マーケティングオートメーション&Mauticとは

私が担当したセッションです。

マーケティングオートメーションという単語は聞き慣れない方も多いと思います。そういった方に向けた内容にまとめました。

MA(マーケティングオートメーション)初心者運用のススメ

株式会社タスクの山田さんが担当されました。

まだまだ、Mauticの導入事例が少ない中、具体的な導入事例を聞けた貴重なセッションでした。

David Hurley: Mauticとマーケティングの未来

最後はMauticのファウンダーである、David Hurley(デイビッド・ハーレー)さんが、約1時間に渡るセッションをしてくれました。

なぜMauticを作ったのか、オープンソースの力についてなど、幅広い話をしてくれました。

TEDのプレゼンテーションを見ているような、引き込まれるプレゼンでした。

 

印象に残った言葉

その後の懇親会で私の拙い英語を駆使してDavidさんと話をしていて印象に残った言葉がありました。

Mautic を広めて行くために大切なことは何だと思う?という私の質問に対して返してくれたDavidさんの言葉です。

1. understand ・・・ 理解してもらうこと
2. do ・・・ 使ってもらうこと
3. Share ・・・皆にシェアすること

これが大切だよ。

なんてシンプルで分かりやすい言葉だろう!

Davidさんありがとうございました。

MauticMeetup集合写真



[CSS]font-familyのメモ。游ゴシック体、游明朝体は美しい

個人的なフォントファミリーのメモです。

他の方はどんなふうにフォントファミリーを指定しているのだろう。気になる気になる。

最近よく指定するfont-family

Windowsでも游ゴシックが使えるようになって来たので、游ゴシックを指定するようになってきました。

游ゴシック、游明朝は大変美しい

游ゴシック、游明朝は大変に美しい。

美しいフォント

ただ、Windowsだとfont-weight:500; などと指定してあげないとブラウザ上で掠れた(かすれた)ようになるので要注意。