Tools\Utility\Time::buildTime PHP Method

buildTime() public static method

Note that the more than hours is currently not supported. Note that duration with DateInterval supports only values < month with accuracy, as it approximates month as "30".
Deprecation: Use duration() instead?
public static buildTime ( integer | DateInterval $duration, string $format = 'H:MM:SS' ) : string
$duration integer | DateInterval Duration in seconds or as DateInterval object
$format string Defaults to hours and minutes
return string Time
    public static function buildTime($duration, $format = 'H:MM:SS')
    {
        if ($duration instanceof \DateInterval) {
            $m = $duration->invert ? -1 : 1;
            $duration = $duration->y * YEAR + $duration->m * MONTH + $duration->d * DAY + $duration->h * HOUR + $duration->i * MINUTE + $duration->s;
            $duration *= $m;
        }
        if ($duration < 0) {
            $duration = abs($duration);
            $isNegative = true;
        }
        $minutes = $duration % HOUR;
        $hours = ($duration - $minutes) / HOUR;
        $res = [];
        if (strpos($format, 'H') !== false) {
            $res[] = (int) $hours . ':' . static::pad((int) ($minutes / MINUTE));
        } else {
            $res[] = (int) ($minutes / MINUTE);
        }
        if (strpos($format, 'SS') !== false) {
            $seconds = $duration % MINUTE;
            $res[] = static::pad((int) $seconds);
        }
        $res = implode(':', $res);
        if (!empty($isNegative)) {
            $res = '-' . $res;
        }
        return $res;
    }

Usage Example

コード例 #1
0
ファイル: TimeTest.php プロジェクト: alescx/cakephp-tools
 /**
  * TimeTest::testBuildTime()
  *
  * @return void
  */
 public function testBuildTime()
 {
     //echo $this->_header(__FUNCTION__);
     $tests = [7440 => '2:04:00', 7220 => '2:00:20', 5400 => '1:30:00', 3660 => '1:01:00', 43202 => '12:00:02'];
     // positive
     foreach ($tests as $was => $expected) {
         $is = $this->Time->buildTime($was);
         //pr($is);
         $this->assertEquals($expected, $is);
     }
     // negative
     foreach ($tests as $was => $expected) {
         $is = $this->Time->buildTime(-$was);
         //pr($is);
         $this->assertEquals('-' . $expected, $is);
     }
     $tests = [7220 => '2:00', 7441 => '2:04', 43202 => '12:00'];
     // positive
     foreach ($tests as $was => $expected) {
         $is = $this->Time->buildTime($was, 'H:MM');
         //pr($is);
         $this->assertEquals($expected, $is);
     }
     // using DateTime interval
     $datetime1 = new DateTime('2009-10-11 13:13:13');
     $datetime2 = new DateTime('2009-10-12 13:13:15');
     $interval = $datetime1->diff($datetime2);
     $result = $this->Time->buildTime($interval, 'H:MM:SS');
     $this->assertEquals('24:00:02', $result);
     // using Time/Carbon
     $start = new Time();
     $end = (new Time())->addMinutes(3);
     $diff = $end->diffInSeconds($start);
     $result = $this->Time->buildTime($diff, 'H:MM:SS');
     $this->assertEquals('0:03:00', $result);
     $result = $this->Time->buildTime($diff, 'M:SS');
     $this->assertEquals('3:00', $result);
 }