Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
50.00% |
1 / 2 |
|
83.33% |
5 / 6 |
CRAP | |
97.37% |
74 / 76 |
| TimeSpan | |
0.00% |
0 / 1 |
|
83.33% |
5 / 6 |
31 | |
97.37% |
74 / 76 |
| __construct($format = null) | |
100.00% |
1 / 1 |
2 | |
100.00% |
2 / 2 |
|||
| _timeUnitStrToInt($string) | |
0.00% |
0 / 1 |
7.77 | |
75.00% |
6 / 8 |
|||
| format($formatString) | |
100.00% |
1 / 1 |
5 | |
100.00% |
14 / 14 |
|||
| set($seconds) | |
100.00% |
1 / 1 |
15 | |
100.00% |
39 / 39 |
|||
| _reset() | |
100.00% |
1 / 1 |
1 | |
100.00% |
7 / 7 |
|||
| getAssoc() | |
100.00% |
1 / 1 |
1 | |
100.00% |
6 / 6 |
|||
| TimeSpanException | |
100.00% |
1 / 1 |
0 | ||||||
| <?php | |
| /** | |
| * | |
| */ | |
| namespace aae\time { | |
| /** | |
| * @author Axel Ancona Esselmann | |
| * @package aae\time | |
| */ | |
| class TimeSpan { | |
| private $_smallestDisplay = 0; | |
| private $_largestDisplay = 5; | |
| private $_roundToLargest = false; | |
| public $s = 0; | |
| public $i = 0; | |
| public $h = 0; | |
| public $d = 0; | |
| public $m = 0; | |
| public $y = 0; | |
| public function __construct($format = null) { | |
| if (!is_null($format)) $this->format($format); | |
| } | |
| private function _timeUnitStrToInt($string) { | |
| switch ($string) { | |
| case 'largest':return -1; | |
| case 's':return 0; | |
| case 'm':return 1; | |
| case 'h':return 2; | |
| case 'd':return 3; | |
| case 'y':return 4; | |
| default: throw new TimeSpanException("Unknown time format string: '$string'", 929151745); | |
| } | |
| } | |
| public function format($formatString) { | |
| $parts = explode('-', $formatString); | |
| $formatInt = $this->_timeUnitStrToInt($parts[0]); | |
| if (count($parts) === 1) { | |
| if ($formatInt == -1) { | |
| $this->_smallestDisplay = 0; | |
| $this->_largestDisplay = 4; | |
| $this->_roundToLargest = true; | |
| } else $this->_smallestDisplay = $this->_largestDisplay = $formatInt; | |
| } elseif (count($parts) === 2) { | |
| $this->_smallestDisplay = $this->_timeUnitStrToInt($parts[0]); | |
| $this->_largestDisplay = $this->_timeUnitStrToInt($parts[1]); | |
| if ($this->_smallestDisplay > $this->_largestDisplay) throw new TimeSpanException("The first date string '".$parts[0]."' is larger than the second date string '".$parts[1]."'.", 929151752); | |
| } else throw new TimeSpanException("Wrong time string format: '$formatString'. Supported strings are: 's' for seconds, 'm' for minutes, 'd' for days, 'm' for months, 'y' for years, and any combination of two of those with '-' as a delimiter. The first value has to be smaller than or equal to the second value.", 929151753); | |
| } | |
| public function set($seconds) { | |
| $result = []; | |
| if ($this->_largestDisplay === 0) return $this->s = $seconds; | |
| $minutes = (int)floor($seconds / 60); | |
| $seconds = (int)($seconds % 60); | |
| if ($this->_smallestDisplay <= 0) $this->s = $seconds; | |
| if ($this->_largestDisplay === 1) return $this->i = (int)($minutes + round($seconds / 60)); | |
| $hours = (int)floor($minutes / 60); | |
| $minutes = (int)($minutes % 60); | |
| if ($this->_smallestDisplay <= 1) $this->i = $minutes; | |
| if ($this->_largestDisplay === 2) return $this->h = (int)($hours + round($minutes / 60)); | |
| $days = (int)floor($hours / 24); | |
| $hours = (int)($hours % 24); | |
| if ($this->_smallestDisplay <= 2) $this->h = $hours; | |
| if ($this->_largestDisplay === 3) return $this->d = (int)($days + round($hours / 24)); | |
| $years = (int)floor($days / 360); | |
| $days = (int)($days % 360); | |
| if ($this->_smallestDisplay <= 3) $this->d = $days; | |
| if ($this->_smallestDisplay === 4) return $this->y = (int)($years + round($days / 360)); | |
| $this->y = $years; | |
| if ($this->_roundToLargest) { | |
| if ($this->y > 0) { | |
| $years = (int)round($this->y + $this->d / 360); | |
| $this->_reset(); | |
| $this->y = $years; | |
| } elseif ($this->d > 0) { | |
| $days = (int)round($this->d + $this->h / 24); | |
| $this->_reset(); | |
| $this->d = $days; | |
| } elseif ($this->h > 0) { | |
| $hours = (int)round($this->h + $this->i / 60); | |
| $this->_reset(); | |
| $this->h = $hours; | |
| } elseif ($this->i > 0) { | |
| $minutes = (int)round($this->i + $this->s / 60); | |
| $this->_reset(); | |
| $this->i = $minutes; | |
| } | |
| } | |
| return; | |
| } | |
| private function _reset() { | |
| $this->s = 0; | |
| $this->i = 0; | |
| $this->h = 0; | |
| $this->d = 0; | |
| $this->m = 0; | |
| $this->y = 0; | |
| } | |
| public function getAssoc() { | |
| return [ | |
| 's' => $this->s, | |
| 'm' => $this->i, | |
| 'h' => $this->h, | |
| 'd' => $this->d, | |
| 'y' => $this->y | |
| ]; | |
| } | |
| } | |
| class TimeSpanException extends \Exception {} | |
| } |