Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
13 / 13 |
| MonthCalc | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
4 | |
100.00% |
13 / 13 |
| calc | |
100.00% |
1 / 1 |
4 | |
100.00% |
13 / 13 |
|||
| <?php | |
| namespace Puyo\Date; | |
| /** | |
| * 月内の日数の差を考慮した月計算クラス | |
| * | |
| * たとえば 3/31 の1ヶ月前は 2/28 とする。 | |
| */ | |
| class MonthCalc | |
| { | |
| /** | |
| * | |
| * @param \DateTime $dt | |
| * @param int $offset | |
| * @return \DateTime | |
| */ | |
| public function calc(\DateTime $dt, $offset) { | |
| if($offset === null) { | |
| $offset = 1; | |
| } | |
| $result = clone $dt; | |
| $day = $dt->format('j'); | |
| if($offset >= 0) { | |
| $dayOfNextMonth = $result->add(new \DateInterval('P'.$offset.'M'))->format('j'); | |
| } else { | |
| $dayOfNextMonth = $result->sub(new \DateInterval('P'.abs($offset).'M'))->format('j'); | |
| } | |
| if($day !== $dayOfNextMonth) { | |
| $result->sub(new \DateInterval('P'.$dayOfNextMonth.'D')); | |
| } | |
| return $result; | |
| } | |
| } |