teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

加筆

2015/10/17 06:49

投稿

退会済みユーザー
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

修正

2015/10/17 06:49

投稿

退会済みユーザー
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

追記

2015/10/16 20:45

投稿

退会済みユーザー
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
- // 土・・祝日のときはカウントしないので、$dateAfterをインクリメント
131
+ // 定休日・祝日のときはカウントしないので、$dateAfterをインクリメント
79
- if (in_array($date->format('w'), array(0, 6)) || self::isHoliday($date)) {
132
+ if (self::isRegularHoliday($date) || self::isHoliday($date)) {
80
133
  $dateAfter++;
81
134
  }
82
135
  }

1

誤字訂正

2015/10/16 20:31

投稿

退会済みユーザー
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
- // 土曜日・日曜日のときはカウントしないので、$dateAfterをインクリメント
78
+ // 土・日曜・祝日のときはカウントしないので、$dateAfterをインクリメント
79
- if (in_array($date->format('w'), [0, 6]) || self::isHoliday($date)) {
79
+ if (in_array($date->format('w'), array(0, 6)) || self::isHoliday($date)) {
80
80
  $dateAfter++;
81
81
  }
82
82
  }