回答編集履歴

4

加筆

2015/10/17 06:49

投稿

退会済みユーザー
test CHANGED
@@ -325,3 +325,47 @@
325
325
  var_dump($res); // 2015-05-07
326
326
 
327
327
  ```
328
+
329
+
330
+
331
+ ---
332
+
333
+
334
+
335
+ > 例
336
+
337
+ > スタートの日付
338
+
339
+ > 本日10月17日土曜にアクセス
340
+
341
+ > 10月19日月曜と処理したい
342
+
343
+ >
344
+
345
+ > 今のプログラムだと
346
+
347
+ > 3営業後は
348
+
349
+ > 21日水曜日になってしまいますが、狙っている結果は22日木曜日です。
350
+
351
+
352
+
353
+ この条件おかしいのでは???
354
+
355
+
356
+
357
+ 10/17(土)基準日
358
+
359
+ 10/18(日)
360
+
361
+ 10/19(月)1営業日後 - 引数には1を渡す(または未指定のときは暗黙的に翌営業日として扱う)
362
+
363
+ 10/20(火)2営業日後 - 引数には2を渡す
364
+
365
+ 10/21(水)3営業日後 - 引数には3を渡す
366
+
367
+ 10/22(木)4営業日後 - 引数には4を渡す
368
+
369
+
370
+
371
+ このように考えたほうが、利用場面で自然だと思いますが…

3

修正

2015/10/17 06:49

投稿

退会済みユーザー
test CHANGED
@@ -24,16 +24,6 @@
24
24
 
25
25
 
26
26
 
27
- // PEAR ライブラリ で出る、PHP Deprecated: Non-static method ... を抑止
28
-
29
- error_reporting(E_NOTICE);
30
-
31
-
32
-
33
- require_once PEAR_INSTALL_DIR . '/Date/Holidays.php';
34
-
35
-
36
-
37
27
  /**
38
28
 
39
29
  * カレンダークラス
@@ -156,6 +146,14 @@
156
146
 
157
147
  // 未取得のとき
158
148
 
149
+ $errorLevel = error_reporting(); // エラー出力レベルを取得
150
+
151
+ error_reporting(E_NOTICE); // PHP Deprecated: Non-static method... を抑止
152
+
153
+
154
+
155
+ require_once 'Date/Holidays.php';
156
+
159
157
  $dh = Date_Holidays::factory('Japan', $year, 'ja_JP');
160
158
 
161
159
  $holidays = array();
@@ -166,6 +164,10 @@
166
164
 
167
165
  }
168
166
 
167
+ error_reporting($errorLevel); // エラー出力レベルを戻す
168
+
169
+
170
+
169
171
  ksort($holidays);
170
172
 
171
173
 
@@ -238,7 +240,7 @@
238
240
 
239
241
  * @param integer $dateAfter 指定しない時は翌営業日を返す
240
242
 
241
- * @param \Datetime $objDate 基準日 指定がない場合は実行日
243
+ * @param \Datetime $objDate 基準日
242
244
 
243
245
  * @return \Datetime
244
246
 

2

追記

2015/10/16 20:45

投稿

退会済みユーザー
test CHANGED
@@ -24,6 +24,12 @@
24
24
 
25
25
 
26
26
 
27
+ // PEAR ライブラリ で出る、PHP Deprecated: Non-static method ... を抑止
28
+
29
+ error_reporting(E_NOTICE);
30
+
31
+
32
+
27
33
  require_once PEAR_INSTALL_DIR . '/Date/Holidays.php';
28
34
 
29
35
 
@@ -44,6 +50,76 @@
44
50
 
45
51
  /**
46
52
 
53
+ * 日曜日
54
+
55
+ */
56
+
57
+ const T_SUNDAY = 0;
58
+
59
+
60
+
61
+ /**
62
+
63
+ * 月曜日
64
+
65
+ */
66
+
67
+ const T_MONDAY = 1;
68
+
69
+
70
+
71
+ /**
72
+
73
+ * 火曜日
74
+
75
+ */
76
+
77
+ const T_TUESDAY = 2;
78
+
79
+
80
+
81
+ /**
82
+
83
+ * 水曜日
84
+
85
+ */
86
+
87
+ const T_WEDNESDAY = 3;
88
+
89
+
90
+
91
+ /**
92
+
93
+ * 木曜日
94
+
95
+ */
96
+
97
+ const T_THURSDAY = 4;
98
+
99
+
100
+
101
+ /**
102
+
103
+ * 金曜日
104
+
105
+ */
106
+
107
+ const T_FRIDAY = 5;
108
+
109
+
110
+
111
+ /**
112
+
113
+ * 土曜日
114
+
115
+ */
116
+
117
+ const T_SATURDAY = 6;
118
+
119
+
120
+
121
+ /**
122
+
47
123
  * キャッシュに使用する祝日配列
48
124
 
49
125
  * @var array(YYYY => array('YYYY-mm-dd' => '祝日名'))
@@ -128,11 +204,41 @@
128
204
 
129
205
  /**
130
206
 
207
+ * 定休日かどうかを判定する
208
+
209
+ * @param \DateTime $objDate 判定する日付
210
+
211
+ * @return bool 定休日ならtrue
212
+
213
+ */
214
+
215
+ public static function isRegularHoliday(\DateTime $objDate)
216
+
217
+ {
218
+
219
+ //定休日リスト
220
+
221
+ $arrRegularHoliday = array(
222
+
223
+ self::T_SUNDAY
224
+
225
+ , self::T_SATURDAY
226
+
227
+ );
228
+
229
+ return in_array($objDate->format('w'), $arrRegularHoliday);
230
+
231
+ }
232
+
233
+
234
+
235
+ /**
236
+
131
237
  * ○日後の営業日を取得する
132
238
 
133
239
  * @param integer $dateAfter 指定しない時は翌営業日を返す
134
240
 
135
- * @param \Datetime $objDate 基準日
241
+ * @param \Datetime $objDate 基準日 指定がない場合は実行日
136
242
 
137
243
  * @return \Datetime
138
244
 
@@ -144,17 +250,17 @@
144
250
 
145
251
  $date = (is_null($objDate)) ? new \DateTime() : $objDate;
146
252
 
253
+ $interval = new \DateInterval("P1D");
254
+
147
255
  for ($i = 0; $i < $dateAfter; $i++) {
148
256
 
149
- $interval = new \DateInterval("P1D");
150
-
151
257
  $date->add($interval);
152
258
 
153
259
 
154
260
 
155
- // 土・・祝日のときはカウントしないので、$dateAfterをインクリメント
261
+ // 定休日・祝日のときはカウントしないので、$dateAfterをインクリメント
156
-
262
+
157
- if (in_array($date->format('w'), array(0, 6)) || self::isHoliday($date)) {
263
+ if (self::isRegularHoliday($date) || self::isHoliday($date)) {
158
264
 
159
265
  $dateAfter++;
160
266
 

1

誤字訂正

2015/10/16 20:31

投稿

退会済みユーザー
test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
 
81
- // 取得のとき
81
+ // 取得のとき
82
82
 
83
83
  $dh = Date_Holidays::factory('Japan', $year, 'ja_JP');
84
84
 
@@ -152,9 +152,9 @@
152
152
 
153
153
 
154
154
 
155
- // 土曜日・日曜日のときはカウントしないので、$dateAfterをインクリメント
155
+ // 土・日曜・祝日のときはカウントしないので、$dateAfterをインクリメント
156
-
156
+
157
- if (in_array($date->format('w'), [0, 6]) || self::isHoliday($date)) {
157
+ if (in_array($date->format('w'), array(0, 6)) || self::isHoliday($date)) {
158
158
 
159
159
  $dateAfter++;
160
160