1cd3e33444efed089098dec32b46dcc7c580cc16
[yaffs-website] / vendor / consolidation / robo / src / Common / TimeKeeper.php
1 <?php
2 namespace Robo\Common;
3
4 class TimeKeeper
5 {
6     const MINUTE = 60;
7     const HOUR = 3600;
8     const DAY = 86400;
9
10     /**
11      * @var float
12      */
13     protected $startedAt;
14
15     /**
16      * @var float
17      */
18     protected $finishedAt;
19
20     public function start()
21     {
22         if ($this->startedAt) {
23             return;
24         }
25         // Get time in seconds as a float, accurate to the microsecond.
26         $this->startedAt = microtime(true);
27     }
28
29     public function stop()
30     {
31         $this->finishedAt = microtime(true);
32     }
33
34     /**
35      * @return float|null
36      */
37     public function elapsed()
38     {
39         $finished = $this->finishedAt ? $this->finishedAt : microtime(true);
40         if ($finished - $this->startedAt <= 0) {
41             return null;
42         }
43         return $finished - $this->startedAt;
44     }
45
46     /**
47      * Format a duration into a human-readable time
48      *
49      * @param float $duration Duration in seconds, with fractional component
50      *
51      * @return string
52      */
53     public static function formatDuration($duration)
54     {
55         if ($duration >= self::DAY * 2) {
56             return gmdate('z \d\a\y\s H:i:s', $duration);
57         }
58         if ($duration > self::DAY) {
59             return gmdate('\1 \d\a\y H:i:s', $duration);
60         }
61         if ($duration > self::HOUR) {
62             return gmdate("H:i:s", $duration);
63         }
64         if ($duration > self::MINUTE) {
65             return gmdate("i:s", $duration);
66         }
67         return round($duration, 3).'s';
68     }
69 }