回答編集履歴
4
加筆
answer
CHANGED
@@ -161,4 +161,26 @@
|
|
161
161
|
// 2015-05-06(振替休日)
|
162
162
|
$res = Calendar::getWeekdayAfter(1, new \DateTime('2015-05-01'));
|
163
163
|
var_dump($res); // 2015-05-07
|
164
|
-
```
|
164
|
+
```
|
165
|
+
|
166
|
+
---
|
167
|
+
|
168
|
+
> 例
|
169
|
+
> スタートの日付
|
170
|
+
> 本日10月17日土曜にアクセス
|
171
|
+
> 10月19日月曜と処理したい
|
172
|
+
>
|
173
|
+
> 今のプログラムだと
|
174
|
+
> 3営業後は
|
175
|
+
> 21日水曜日になってしまいますが、狙っている結果は22日木曜日です。
|
176
|
+
|
177
|
+
この条件おかしいのでは???
|
178
|
+
|
179
|
+
10/17(土)基準日
|
180
|
+
10/18(日)
|
181
|
+
10/19(月)1営業日後 - 引数には1を渡す(または未指定のときは暗黙的に翌営業日として扱う)
|
182
|
+
10/20(火)2営業日後 - 引数には2を渡す
|
183
|
+
10/21(水)3営業日後 - 引数には3を渡す
|
184
|
+
10/22(木)4営業日後 - 引数には4を渡す
|
185
|
+
|
186
|
+
このように考えたほうが、利用場面で自然だと思いますが…
|
3
修正
answer
CHANGED
@@ -11,11 +11,6 @@
|
|
11
11
|
```php
|
12
12
|
<?php
|
13
13
|
|
14
|
-
// PEAR ライブラリ で出る、PHP Deprecated: Non-static method ... を抑止
|
15
|
-
error_reporting(E_NOTICE);
|
16
|
-
|
17
|
-
require_once PEAR_INSTALL_DIR . '/Date/Holidays.php';
|
18
|
-
|
19
14
|
/**
|
20
15
|
* カレンダークラス
|
21
16
|
* Calendar.class.php
|
@@ -77,11 +72,17 @@
|
|
77
72
|
}
|
78
73
|
|
79
74
|
// 未取得のとき
|
75
|
+
$errorLevel = error_reporting(); // エラー出力レベルを取得
|
76
|
+
error_reporting(E_NOTICE); // PHP Deprecated: Non-static method... を抑止
|
77
|
+
|
78
|
+
require_once 'Date/Holidays.php';
|
80
79
|
$dh = Date_Holidays::factory('Japan', $year, 'ja_JP');
|
81
80
|
$holidays = array();
|
82
81
|
foreach ($dh->getHolidays() as $h) {
|
83
82
|
$holidays[$h->getDate()->format('%Y-%m-%d')] = $h->getTitle();
|
84
83
|
}
|
84
|
+
error_reporting($errorLevel); // エラー出力レベルを戻す
|
85
|
+
|
85
86
|
ksort($holidays);
|
86
87
|
|
87
88
|
static::$_arrHolidays[$year] = $holidays;
|
@@ -118,7 +119,7 @@
|
|
118
119
|
/**
|
119
120
|
* ○日後の営業日を取得する
|
120
121
|
* @param integer $dateAfter 指定しない時は翌営業日を返す
|
121
|
-
* @param \Datetime $objDate 基準日
|
122
|
+
* @param \Datetime $objDate 基準日
|
122
123
|
* @return \Datetime
|
123
124
|
*/
|
124
125
|
public static function getWeekdayAfter($dateAfter = 1, \DateTime $objDate = null)
|
2
追記
answer
CHANGED
@@ -11,6 +11,9 @@
|
|
11
11
|
```php
|
12
12
|
<?php
|
13
13
|
|
14
|
+
// PEAR ライブラリ で出る、PHP Deprecated: Non-static method ... を抑止
|
15
|
+
error_reporting(E_NOTICE);
|
16
|
+
|
14
17
|
require_once PEAR_INSTALL_DIR . '/Date/Holidays.php';
|
15
18
|
|
16
19
|
/**
|
@@ -21,6 +24,41 @@
|
|
21
24
|
{
|
22
25
|
|
23
26
|
/**
|
27
|
+
* 日曜日
|
28
|
+
*/
|
29
|
+
const T_SUNDAY = 0;
|
30
|
+
|
31
|
+
/**
|
32
|
+
* 月曜日
|
33
|
+
*/
|
34
|
+
const T_MONDAY = 1;
|
35
|
+
|
36
|
+
/**
|
37
|
+
* 火曜日
|
38
|
+
*/
|
39
|
+
const T_TUESDAY = 2;
|
40
|
+
|
41
|
+
/**
|
42
|
+
* 水曜日
|
43
|
+
*/
|
44
|
+
const T_WEDNESDAY = 3;
|
45
|
+
|
46
|
+
/**
|
47
|
+
* 木曜日
|
48
|
+
*/
|
49
|
+
const T_THURSDAY = 4;
|
50
|
+
|
51
|
+
/**
|
52
|
+
* 金曜日
|
53
|
+
*/
|
54
|
+
const T_FRIDAY = 5;
|
55
|
+
|
56
|
+
/**
|
57
|
+
* 土曜日
|
58
|
+
*/
|
59
|
+
const T_SATURDAY = 6;
|
60
|
+
|
61
|
+
/**
|
24
62
|
* キャッシュに使用する祝日配列
|
25
63
|
* @var array(YYYY => array('YYYY-mm-dd' => '祝日名'))
|
26
64
|
*/
|
@@ -63,20 +101,35 @@
|
|
63
101
|
}
|
64
102
|
|
65
103
|
/**
|
104
|
+
* 定休日かどうかを判定する
|
105
|
+
* @param \DateTime $objDate 判定する日付
|
106
|
+
* @return bool 定休日ならtrue
|
107
|
+
*/
|
108
|
+
public static function isRegularHoliday(\DateTime $objDate)
|
109
|
+
{
|
110
|
+
//定休日リスト
|
111
|
+
$arrRegularHoliday = array(
|
112
|
+
self::T_SUNDAY
|
113
|
+
, self::T_SATURDAY
|
114
|
+
);
|
115
|
+
return in_array($objDate->format('w'), $arrRegularHoliday);
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
66
119
|
* ○日後の営業日を取得する
|
67
120
|
* @param integer $dateAfter 指定しない時は翌営業日を返す
|
68
|
-
* @param \Datetime $objDate 基準日
|
121
|
+
* @param \Datetime $objDate 基準日 指定がない場合は実行日
|
69
122
|
* @return \Datetime
|
70
123
|
*/
|
71
124
|
public static function getWeekdayAfter($dateAfter = 1, \DateTime $objDate = null)
|
72
125
|
{
|
73
126
|
$date = (is_null($objDate)) ? new \DateTime() : $objDate;
|
127
|
+
$interval = new \DateInterval("P1D");
|
74
128
|
for ($i = 0; $i < $dateAfter; $i++) {
|
75
|
-
$interval = new \DateInterval("P1D");
|
76
129
|
$date->add($interval);
|
77
130
|
|
78
|
-
//
|
131
|
+
// 定休日・祝日のときはカウントしないので、$dateAfterをインクリメント
|
79
|
-
if (
|
132
|
+
if (self::isRegularHoliday($date) || self::isHoliday($date)) {
|
80
133
|
$dateAfter++;
|
81
134
|
}
|
82
135
|
}
|
1
誤字訂正
answer
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
return static::$_arrHolidays[$year];
|
39
39
|
}
|
40
40
|
|
41
|
-
//
|
41
|
+
// 未取得のとき
|
42
42
|
$dh = Date_Holidays::factory('Japan', $year, 'ja_JP');
|
43
43
|
$holidays = array();
|
44
44
|
foreach ($dh->getHolidays() as $h) {
|
@@ -75,8 +75,8 @@
|
|
75
75
|
$interval = new \DateInterval("P1D");
|
76
76
|
$date->add($interval);
|
77
77
|
|
78
|
-
// 土
|
78
|
+
// 土・日曜・祝日のときはカウントしないので、$dateAfterをインクリメント
|
79
|
-
if (in_array($date->format('w'),
|
79
|
+
if (in_array($date->format('w'), array(0, 6)) || self::isHoliday($date)) {
|
80
80
|
$dateAfter++;
|
81
81
|
}
|
82
82
|
}
|