Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00017 final class Time implements Stringable
00018 {
00019 private $hour = 0;
00020 private $minute = 0;
00021 private $second = 0;
00022
00023 private $string = null;
00024
00028 public static function create($input)
00029 {
00030 return new self($input);
00031 }
00032
00033
00034 public function __construct($input)
00035 {
00036 if (Assert::checkInteger($input)) {
00037 $time = $input;
00038 } else {
00039 Assert::isString($input);
00040 $time = explode(':', $input);
00041 }
00042
00043 $lenght = strlen($input);
00044
00045 if (count($time) === 2) {
00046 $this->
00047 setHour($time[0])->
00048 setMinute($time[1]);
00049 } elseif (count($time) === 3) {
00050 $this->
00051 setHour($time[0])->
00052 setMinute($time[1])->
00053 setSecond($time[2]);
00054 } else {
00055 switch ($lenght) {
00056 case 1:
00057 case 2:
00058
00059 $this->setHour(substr($input, 0, 2));
00060 break;
00061
00062 case 3:
00063
00064 $assumedHour = substr($input, 0, 2);
00065
00066 if ($assumedHour > 23)
00067 $this->
00068 setHour(substr($input, 0, 1))->
00069 setMinute(substr($input, 1, 2));
00070 else
00071 $this->
00072 setHour($assumedHour)->
00073 setMinute(substr($input, 2, 1).'0');
00074
00075 break;
00076
00077 case 4:
00078 case 5:
00079 case 6:
00080
00081 $this->
00082 setHour(substr($input, 0, 2))->
00083 setMinute(substr($input, 2, 2))->
00084 setSecond(substr($input, 4, 2));
00085
00086 break;
00087
00088 default:
00089 throw new WrongArgumentException('unknown format');
00090 }
00091 }
00092 }
00093
00094 public function getHour()
00095 {
00096 return $this->hour;
00097 }
00098
00102 public function setHour($hour)
00103 {
00104 $hour = (int) $hour;
00105
00106 Assert::isTrue(
00107 $hour >= 0 &&
00108 $hour <= 24,
00109 'wrong hour specified'
00110 );
00111
00112 $this->hour = $hour;
00113 $this->string = null;
00114
00115 return $this;
00116 }
00117
00118 public function getMinute()
00119 {
00120 return $this->minute;
00121 }
00122
00126 public function setMinute($minute)
00127 {
00128 $minute = (int) $minute;
00129
00130 Assert::isTrue(
00131 $minute >= 0
00132 && $minute <= 60,
00133
00134 'wrong minute specified'
00135 );
00136
00137 $this->minute = $minute;
00138 $this->string = null;
00139
00140 return $this;
00141 }
00142
00143 public function getSecond()
00144 {
00145 return $this->second;
00146 }
00147
00151 public function setSecond($second)
00152 {
00153 $second = (int) $second;
00154
00155 Assert::isTrue(
00156 $second >= 0
00157 && $second <= 60,
00158
00159 'wrong second specified'
00160 );
00161
00162 $this->second = $second;
00163 $this->string = null;
00164
00165 return $this;
00166 }
00167
00169 public function toString($delimiter = ':')
00170 {
00171 if ($this->string === null)
00172 $this->string =
00173 $this->doublize($this->hour)
00174 .$delimiter
00175 .$this->doublize($this->minute);
00176
00177 return $this->string;
00178 }
00179
00181 public function toFullString($delimiter = ':')
00182 {
00183 return
00184 $this->toString($delimiter)
00185 .$delimiter.(
00186 $this->second
00187 ? $this->doublize($this->second)
00188 : '00'
00189 );
00190 }
00191
00192 public function toMinutes()
00193 {
00194 return
00195 ($this->hour * 60)
00196 + $this->minute
00197 + round($this->second / 100, 0);
00198 }
00199
00200 public function toSeconds()
00201 {
00202 return
00203 ($this->hour * 3600)
00204 + ($this->minute * 60)
00205 + $this->second;
00206 }
00207
00208 private function doublize($int)
00209 {
00210 return sprintf('%02d', $int);
00211 }
00212 }
00213 ?>