1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13: class QDateTimeSpan extends QBaseClass{
14:
15: protected $intSeconds;
16:
17: 18: 19: 20: 21: 22: 23:
24:
25: const SecondsPerYear = 31556926;
26:
27:
28:
29: const SecondsPerMonth = 2592000;
30:
31: const SecondsPerDay = 86400;
32:
33: const SecondsPerHour = 3600;
34:
35: const SecondsPerMinute = 60;
36:
37: 38: 39: 40: 41:
42: public function __construct($intSeconds = 0) {
43: $this->intSeconds = $intSeconds;
44: }
45:
46: 47: 48:
49:
50: 51: 52: 53: 54:
55: public function IsPositive(){
56: return ($this->intSeconds > 0);
57: }
58:
59: 60: 61: 62: 63:
64: public function IsNegative(){
65: return ($this->intSeconds < 0);
66: }
67:
68: 69: 70: 71: 72:
73: public function IsZero(){
74: return ($this->intSeconds == 0);
75: }
76:
77: 78: 79: 80: 81: 82:
83: public function Difference(QDateTimeSpan $dtsSpan){
84: $intDifference = $this->Seconds - $dtsSpan->Seconds;
85: $dtsDateSpan = new QDateTimeSpan();
86: $dtsDateSpan->AddSeconds($intDifference);
87: return $dtsDateSpan;
88: }
89:
90: 91: 92:
93:
94: 95: 96: 97: 98: 99:
100: public function SetFromQDateTime(QDateTime $dttFrom, QDateTime $dttTo){
101: $this->Add($dttFrom->Difference($dttTo));
102: }
103:
104: 105: 106:
107:
108: 109: 110: 111: 112:
113: public function AddSeconds($intSeconds){
114: $this->intSeconds = $this->intSeconds + $intSeconds;
115: }
116:
117: 118: 119: 120: 121:
122: public function AddMinutes($intMinutes){
123: $this->intSeconds = $this->intSeconds + ($intMinutes * QDateTimeSpan::SecondsPerMinute);
124: }
125:
126: 127: 128: 129: 130:
131: public function AddHours($intHours){
132: $this->intSeconds = $this->intSeconds + ($intHours * QDateTimeSpan::SecondsPerHour);
133: }
134:
135: 136: 137: 138: 139:
140: public function AddDays($intDays){
141: $this->intSeconds = $this->intSeconds + ($intDays * QDateTimeSpan::SecondsPerDay);
142: }
143:
144: 145: 146: 147: 148:
149: public function AddMonths($intMonths){
150: $this->intSeconds = $this->intSeconds + ($intMonths * QDateTimeSpan::SecondsPerMonth);
151: }
152:
153: 154: 155:
156:
157: 158: 159: 160: 161:
162: protected function GetYears() {
163: $intSecondsPerYear = ($this->IsPositive()) ? QDateTimeSpan::SecondsPerYear : ((-1) * QDateTimeSpan::SecondsPerYear);
164: $intYears = floor($this->intSeconds / $intSecondsPerYear);
165: if ($this->IsNegative()) $intYears = (-1) * $intYears;
166: return $intYears;
167: }
168:
169: 170: 171: 172: 173:
174: protected function GetMonths(){
175: $intSecondsPerMonth = ($this->IsPositive()) ? QDateTimeSpan::SecondsPerMonth : ((-1) * QDateTimeSpan::SecondsPerMonth);
176: $intMonths = floor($this->intSeconds / $intSecondsPerMonth);
177: if($this->IsNegative()) $intMonths = (-1) * $intMonths;
178: return $intMonths;
179: }
180:
181: 182: 183: 184: 185:
186: protected function GetDays(){
187: $intSecondsPerDay = ($this->IsPositive()) ? QDateTimeSpan::SecondsPerDay : ((-1) * QDateTimeSpan::SecondsPerDay);
188: $intDays = floor($this->intSeconds / $intSecondsPerDay);
189: if($this->IsNegative()) $intDays = (-1) * $intDays;
190: return $intDays;
191: }
192:
193: 194: 195: 196: 197:
198: protected function GetHours(){
199: $intSecondsPerHour = ($this->IsPositive()) ? QDateTimeSpan::SecondsPerHour : ((-1) * QDateTimeSpan::SecondsPerHour);
200: $intHours = floor($this->intSeconds / $intSecondsPerHour);
201: if($this->IsNegative()) $intHours = (-1) * $intHours;
202: return $intHours;
203: }
204:
205: 206: 207: 208: 209:
210: protected function GetMinutes(){
211: $intSecondsPerMinute = ($this->IsPositive()) ? QDateTimeSpan::SecondsPerMinute : ((-1) * QDateTimeSpan::SecondsPerMinute);
212: $intMinutes = floor($this->intSeconds / $intSecondsPerMinute);
213: if($this->IsNegative()) $intMinutes = (-1) * $intMinutes;
214: return $intMinutes;
215: }
216:
217: 218: 219:
220:
221: 222: 223: 224: 225:
226: public function Add(QDateTimeSpan $dtsSpan){
227: $this->intSeconds = $this->intSeconds + $dtsSpan->Seconds;
228: }
229:
230: 231: 232: 233: 234:
235: public function Subtract(QDateTimeSpan $dtsSpan){
236: $this->intSeconds = $this->intSeconds - $dtsSpan->Seconds;
237: }
238:
239: 240: 241: 242: 243: 244: 245: 246:
247: public function SimpleDisplay(){
248: $arrTimearray = $this->GetTimearray();
249: $strToReturn = null;
250:
251: if($arrTimearray['Years'] != 0) {
252: $strFormat = ($arrTimearray['Years'] != 1) ? QApplication::Translate('about %s years') : QApplication::Translate('a year');
253: $strToReturn = sprintf($strFormat, $arrTimearray['Years']);
254: }
255: elseif($arrTimearray['Months'] != 0){
256: $strFormat = ($arrTimearray['Months'] != 1) ? QApplication::Translate('about %s months') : QApplication::Translate('a month');
257: $strToReturn = sprintf($strFormat,$arrTimearray['Months']);
258: }
259: elseif($arrTimearray['Days'] != 0){
260: $strFormat = ($arrTimearray['Days'] != 1) ? QApplication::Translate('about %s days') : QApplication::Translate('a day');
261: $strToReturn = sprintf($strFormat,$arrTimearray['Days']);
262: }
263: elseif($arrTimearray['Hours'] != 0){
264: $strFormat = ($arrTimearray['Hours'] != 1) ? QApplication::Translate('about %s hours') : QApplication::Translate('an hour');
265: $strToReturn = sprintf($strFormat,$arrTimearray['Hours']);
266: }
267: elseif($arrTimearray['Minutes'] != 0){
268: $strFormat = ($arrTimearray['Minutes'] != 1) ? QApplication::Translate('%s minutes') : QApplication::Translate('a minute');
269: $strToReturn = sprintf($strFormat,$arrTimearray['Minutes']);
270: }
271: elseif($arrTimearray['Seconds'] != 0 ){
272: $strFormat = ($arrTimearray['Seconds'] != 1) ? QApplication::Translate('%s seconds') : QApplication::Translate('a second');
273: $strToReturn = sprintf($strFormat,$arrTimearray['Seconds']);
274: }
275:
276: return $strToReturn;
277: }
278:
279:
280: 281: 282: 283: 284:
285: protected function GetTimearray(){
286: $intSeconds = abs($this->intSeconds);
287:
288: $intYears = floor($intSeconds / QDateTimeSpan::SecondsPerYear);
289: $intSeconds = $intSeconds - ($intYears * QDateTimeSpan::SecondsPerYear);
290:
291: $intMonths = floor($intSeconds / QDateTimeSpan::SecondsPerMonth);
292: $intSeconds = $intSeconds - ($intMonths * QDateTimeSpan::SecondsPerMonth);
293:
294: $intDays = floor($intSeconds / QDateTimeSpan::SecondsPerDay);
295: $intSeconds = $intSeconds - ($intDays * QDateTimeSpan::SecondsPerDay);
296:
297: $intHours = floor($intSeconds / QDateTimeSpan::SecondsPerHour);
298: $intSeconds = $intSeconds - ($intHours * QDateTimeSpan::SecondsPerHour);
299:
300: $intMinutes = floor($intSeconds / QDateTimeSpan::SecondsPerMinute);
301: $intSeconds = $intSeconds - ($intMinutes * QDateTimeSpan::SecondsPerMinute);
302:
303: if($this->IsNegative()){
304:
305: $intYears = ((-1) * $intYears);
306: $intMonths = ((-1) * $intMonths);
307: $intDays = ((-1) * $intDays);
308: $intHours = ((-1) * $intHours);
309: $intMinutes = ((-1) * $intMinutes);
310: $intSeconds = ((-1) * $intSeconds);
311: }
312:
313: return array('Years' => $intYears, 'Months' => $intMonths, 'Days' => $intDays, 'Hours' => $intHours, 'Minutes' => $intMinutes,'Seconds' => $intSeconds);
314: }
315:
316: 317: 318: 319: 320: 321: 322: 323: 324: 325:
326:
327: public function __get($strName) {
328: switch ($strName) {
329: case 'Years': return $this->GetYears();
330: case 'Months': return $this->GetMonths();
331: case 'Days': return $this->GetDays();
332: case 'Hours': return $this->GetHours();
333: case 'Minutes': return $this->GetMinutes();
334: case 'Seconds': return $this->intSeconds;
335: case 'Timearray' : return ($this->GetTimearray());
336:
337: default:
338: try {
339: return parent::__get($strName);
340: } catch (QCallerException $objExc) {
341: $objExc->IncrementOffset();
342: throw $objExc;
343: }
344: }
345: }
346:
347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357:
358:
359: public function __set($strName, $mixValue) {
360: try {
361: switch ($strName) {
362: case 'Seconds':
363: return ($this->intSeconds = QType::Cast($mixValue, QType::Integer));
364: default:
365: return (parent::__set($strName, $mixValue));
366: }
367: } catch (QCallerException $objExc) {
368: $objExc->IncrementOffset();
369: throw $objExc;
370: }
371: }
372: }