Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
81.82% covered (success)
81.82%
9 / 11
CRAP
93.10% covered (success)
93.10%
27 / 29
DTI
0.00% covered (danger)
0.00%
0 / 1
81.82% covered (success)
81.82%
9 / 11
14.06
93.10% covered (success)
93.10%
27 / 29
 add
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 createFromFormat
0.00% covered (danger)
0.00%
0 / 1
3.03
85.71% covered (success)
85.71%
6 / 7
 createFromMutable
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 modify
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setDate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setISODate
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setTime
0.00% covered (danger)
0.00%
0 / 1
2.03
80.00% covered (success)
80.00%
4 / 5
 setTimestamp
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 setTimezone
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 sub
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 cloneAsDateTime
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
<?php
namespace Puyo\Time;
/**
 * DateTimeImmutableと同等のもの。ImmutableなDateTime。
 *
 * PHP-5.5系のDateTimeImmutableには致命的なバグが多く、
 * とくに 5.5.8 よりも古い環境ではそれが顕著。
 *
 * マイナーバージョンが不明な環境でDateTimeImmutable相当のことをするために作成した。
 * よってDateTimeImmutableが信頼できる環境下ではそれを使ったほうがよい。
 * @author y.kushida
 * @version 1.0.0
 * @uses >= php-5.5
 */
class DTI extends \DateTime
{
    public function add($interval) {
        $datetime = $this->cloneAsDateTime()->add($interval);
        return self::createFromMutable($datetime);
    }
    public static function createFromFormat($format, $time, $timezone=null) {
        if($timezone !== null) {  // php-5.5.11ではnullを渡してはならなかった
            $datetime = parent::createFromFormat($format, $time, $timezone);
        } else {
            $datetime = parent::createFromFormat($format, $time);
        }
        if($datetime === false) {
            return false;
        } else {
            return self::createFromMutable($datetime);
        }
    }
    public static function createFromMutable(\DateTime $datetime) {
        return new DTI($datetime->format('Y-m-d H:i:s'), $datetime->getTimezone());
    }
    public function modify($modify) {
        $datetime = $this->cloneAsDateTime()->modify($modify);
        return self::createFromMutable($datetime);
    }
    public function setDate($year, $month, $day) {
        $datetime = $this->cloneAsDateTime()->setDate($year, $month, $day);
        return self::createFromMutable($datetime);
    }
    public function setISODate($year, $month, $day=1) {
        $datetime = $this->cloneAsDateTime()->setISODate($year, $month, $day);
        return self::createFromMutable($datetime);
    }
    public function setTime($hour, $minute, $second=0, $microseconds=0) {
        if(version_compare(PHP_VERSION, '7.1', '<')) {
            $datetime = $this->cloneAsDateTime()->setTime($hour, $minute, $second);
        } else {
            $datetime = $this->cloneAsDateTime()->setTime($hour, $minute, $second, $microseconds);
        }
        return self::createFromMutable($datetime);
    }
    public function setTimestamp($unixtimestamp) {
        $datetime = $this->cloneAsDateTime()->setTimestamp($unixtimestamp);
        return self::createFromMutable($datetime);
    }
    public function setTimezone($timezone) {
        $datetime = $this->cloneAsDateTime()->setTimezone($timezone);
        return self::createFromMutable($datetime);
    }
    public function sub($interval) {
        $datetime = $this->cloneAsDateTime()->sub($interval);
        return self::createFromMutable($datetime);
    }
    /**
     * DateTimeにして返す。オリジナル。
     * @return \DateTime
     */
    public function cloneAsDateTime() {
        $format = 'Y-m-d H:i:s';
        return \DateTime::createFromFormat($format, $this->format($format), $this->getTimezone());
    }
}