自分なりの目線で情報を発信します。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Zend_Dateを使って、平日(営業日)か否かを返す処理を作りました。
祝日データは、とりあえずDBを使わずに配列に突っ込んでます。
普通に祝日テーブルを作ってそこから読み込めば済む話だと思うので、
気が向いたら修正しようと思います。
■仕様
受け取った日付が土日祝日以外ならTRUEを返す
(土曜は休日とみなします)
(土曜は休日とみなします)
まだまだキレイに書けるはずですが、
とりあえずこんな感じで。
振替休日、ハッピーマンデー、
前後が祝日の平日は国民の休日、
にも対応していますが、バグあったらすんませんです~。
-
/**
-
* 営業日(平日)か否かを返す
-
*
-
* @param Zend_Date
-
* @return bool
-
*/
-
public static function isBusinessDay($judgeDate)
-
{
-
$workdate = new Zend_Date($now_ts, Zend_Date::TIMESTAMP);
-
-
// 祝日の配列
-
// 名前
-
// 月
-
// 日
-
// ハッピーマンデーになる月曜日の番号(対象月の何回目の月曜日か)
-
'name' => '元日', 'month' => '1', 'day' => '1',
-
'happy_monday_num' => ''
-
),
-
'name' => '成人の日', 'month' => '1', 'day' => '',
-
'happy_monday_num' => '2'
-
)
-
);
-
'name' => '建国記念の日', 'month' => '2', 'day' => '11',
-
'happy_monday_num' => ''
-
)
-
);
-
'name' => '春分の日', 'month' => '3', 'day' => '20',
-
'happy_monday_num' => ''
-
)
-
);
-
'name' => '昭和の日', 'month' => '4', 'day' => '29',
-
'happy_monday_num' => ''
-
)
-
);
-
'name' => '憲法記念日', 'month' => '5', 'day' => '3',
-
'happy_monday_num' => ''
-
),
-
'name' => '昭和の日', 'month' => '5', 'day' => '4',
-
'happy_monday_num' => ''
-
),
-
'name' => 'こどもの日', 'month' => '5', 'day' => '5',
-
'happy_monday_num' => ''
-
)
-
);
-
'name' => '海の日', 'month' => '7', 'day' => '',
-
'happy_monday_num' => '3'
-
)
-
);
-
'name' => '敬老の日', 'month' => '9', 'day' => '',
-
'happy_monday_num' => '3'
-
),
-
'name' => '秋分の日', 'month' => '9', 'day' => '23',
-
'happy_monday_num' => ''
-
)
-
);
-
'name' => '体育の日', 'month' => '10', 'day' => '',
-
'happy_monday_num' => '2'
-
)
-
);
-
'name' => '文化の日', 'month' => '11', 'day' => '3',
-
'happy_monday_num' => ''
-
),
-
'name' => '勤労感謝の日', 'month' => '11', 'day' => '23',
-
'happy_monday_num' => ''
-
)
-
);
-
'name' => '天皇誕生日', 'month' => '12', 'day' => '23',
-
'happy_monday_num' => ''
-
)
-
);
-
-
// 振替休日
-
-
$judgeWeekdayNum = $judgeDate->get('e');
-
if ($judgeWeekdayNum === '0' || $judgeWeekdayNum === '6') {
-
// 土日は休日
-
return FALSE;
-
}
-
-
$judgeYear = $judgeDate->get('yyyy');
-
$judgeMonth = $judgeDate->get('M');
-
$judgeDay = $judgeDate->get('d');
-
foreach ($publicHoliday[$judgeMonth] as $key => $pubHoliday) {
-
if ($judgeDay === $pubHoliday['day']) {
-
// 判定日は祝日である
-
return FALSE;
-
}
-
-
try {
-
if ($pubHoliday['happy_monday_num'] !== '') {
-
// 月の最初の月曜日を探す
-
$firstMonday = 0;
-
$workdate->set($judgeYear, Zend_Date::YEAR);
-
$workdate->set($pubHoliday['month'], Zend_Date::MONTH_SHORT);
-
$workdate->set('1', Zend_Date::DAY_SHORT);
-
while (TRUE) {
-
if ($workdate->get('e') === '1') {
-
// 月の最初の月曜日が見つかった
-
$firstMonday = $workdate->get('d');
-
break;
-
}
-
// 翌日の判定へ
-
$workdate->add('1', Zend_Date::DAY_SHORT);
-
continue;
-
}
-
// ハッピーマンデーの日付
-
$happyMonday = (int)$firstMonday + 7 * ((int)$pubHoliday['happy_monday_num'] - 1);
-
$happyMonday = (string)$happyMonday;
-
// ハッピーマンデーを祝日用配列に記憶
-
$publicHoliday[$judgeMonth][$key]['day'] = $happyMonday;
-
if ($judgeDay === $happyMonday) {
-
// 判定日はハッピーマンデーである
-
return FALSE;
-
}
-
// ハッピーマンデーのため以降の処理は不要
-
continue;
-
}
-
-
$workdate->set($judgeYear, Zend_Date::YEAR);
-
$workdate->set($pubHoliday['month'], Zend_Date::MONTH_SHORT);
-
$workdate->set($pubHoliday['day'], Zend_Date::DAY_SHORT);
-
$weekdayNum = $workdate->get('e');
-
if ($weekdayNum === '0') {
-
// この祝日は日曜日 →振替休日を求める
-
while (TRUE) {
-
$nextIsPubHoliday = FALSE;
-
$workdate->add('1', Zend_Date::DAY_SHORT);
-
$nextday = $workdate->get('d');
-
foreach ($publicHoliday[$judgeMonth] as $pubHoliday2) {
-
if ($nextday === $pubHoliday2['day']) {
-
// 翌日は祝日である
-
$nextIsPubHoliday = TRUE;
-
break;
-
}
-
}
-
if ($nextIsPubHoliday) {
-
// 翌日が祝日である →さらに翌日を判定する
-
continue;
-
} else {
-
// 翌日が祝日ではない →振替休日に設定
-
$makeupHoliday[$judgeMonth][] =
-
'name' => '振替休日', 'month' => $judgeMonth, 'day' => $workdate->get('d'),
-
'happy_monday_num' => ''
-
);
-
break;
-
-
}
-
}
-
}
-
} catch (Exception $e) {
-
}
-
}
-
-
// 振替休日の判定
-
foreach ($makeupHoliday[$judgeMonth] as $mkHoliday) {
-
if ($judgeDay === $mkHoliday['day']) {
-
// 判定日は振替休日である
-
return FALSE;
-
}
-
}
-
}
-
// 判定日は国民の祝日ではないが、
-
// 判定日の前日及び翌日が「国民の祝日」なら休日
-
$judgeDayPrev = (string)((int)$judgeDay - 1);
-
$judgeDayNext = (string)((int)$judgeDay + 1);
-
foreach ($publicHoliday[$judgeMonth] as $pubHoliday) {
-
if ($judgeDayPrev === $pubHoliday['day']) {
-
foreach ($publicHoliday[$judgeMonth] as $pubHoliday2) {
-
if ($judgeDayNext === $pubHoliday2['day']) {
-
// 判定日の前日及び翌日が「国民の祝日」である
-
return FALSE;
-
}
-
}
-
}
-
}
-
-
// 判定日は営業日(平日)である
-
return TRUE;
-
}
PR
この記事にコメントする
お知らせ
最新記事
(03/11)
(02/23)
(01/08)
(12/28)
(11/18)
カテゴリー
プロフィール
HN:
shusatoo
性別:
男性
自己紹介:
基本PHP。JavaScriptちょっとだけ。Javaをほんの少し。
最新トラックバック
カレンダー
12 | 2025/01 | 02 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
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 |
ブログ内検索
最古記事
(09/18)
(09/23)
(10/01)
(10/09)
(10/10)
カウンター
アク解アナライズ
ビジター