Completed
Push — master ( bb1b6d...e5c57f )
by Michael
04:27
created

DateTime   F

Complexity

Total Complexity 80

Size/Duplication

Total Lines 1018
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Test Coverage

Coverage 95.79%

Importance

Changes 39
Bugs 1 Features 2
Metric Value
wmc 80
c 39
b 1
f 2
lcom 1
cbo 11
dl 0
loc 1018
ccs 205
cts 214
cp 0.9579
rs 3.9999

61 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 20 4
A parse() 0 4 1
A createFromDate() 0 4 1
A createFromTime() 0 4 1
A now() 0 4 1
A today() 0 4 1
A isAfter() 0 4 1
A isBefore() 0 4 1
A equals() 0 4 1
A diff() 0 4 1
A addDays() 0 4 1
A subDays() 0 4 1
A addWeeks() 0 4 1
A subWeeks() 0 4 1
A addMonths() 0 4 1
A subMonths() 0 4 1
A addYears() 0 4 1
A subYears() 0 4 1
A addSeconds() 0 4 1
A subSeconds() 0 4 1
A addMinutes() 0 4 1
A subMinutes() 0 4 1
A addHours() 0 4 1
A subHours() 0 4 1
A startOfDay() 0 4 1
A endOfDay() 0 4 1
A since() 0 4 1
A sinceAlmost() 0 4 1
A __get() 0 4 1
A get() 0 4 1
A getOffset() 0 4 1
A getTimestamp() 0 4 1
A getTimezone() 0 4 1
A getDateTime() 0 4 1
A setSince() 0 4 1
A setTranslator() 0 4 1
A setGetter() 0 4 1
A setParser() 0 4 1
A setLocale() 0 4 1
A setStrategy() 0 4 1
A createFromFormat() 0 6 2
A create() 0 6 1
A tomorrow() 0 6 1
A yesterday() 0 6 1
A add() 0 9 1
A sub() 0 9 1
A startOfWeek() 0 6 1
A endOfWeek() 0 6 1
A startOfMonth() 0 6 1
A endOfMonth() 0 6 1
A startOfYear() 0 6 1
A endOfYear() 0 6 1
C format() 0 49 9
A getTranslator() 0 9 2
A getStrategy() 0 9 2
A calc() 0 7 2
A modify() 0 7 1
A fixMonth() 0 10 2
A getSince() 0 9 2
A getGetter() 0 9 2
A getParser() 0 9 2

How to fix   Complexity   

Complex Class

Complex classes like DateTime often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use DateTime, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * Part of the Joomla Framework DateTime Package
4
 *
5
 * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
6
 * @license    GNU Lesser General Public License version 2.1 or later; see LICENSE
7
 */
8
9
namespace Joomla\DateTime;
10
11
/**
12
 * DateTime.
13
 *
14
 * @since  2.0.0
15
 *
16
 * @property-read  string   $daysinmonth  t - Number of days in the given month.
17
 * @property-read  string   $dayofweek    N - ISO-8601 numeric representation of the day of the week.
18
 * @property-read  string   $dayofyear    z - The day of the year (starting from 0).
19
 * @property-read  boolean  $isleapyear   L - Whether it's a leap year.
20
 * @property-read  string   $day          d - Day of the month, 2 digits with leading zeros.
21
 * @property-read  string   $hour         H - 24-hour format of an hour with leading zeros.
22
 * @property-read  string   $minute       i - Minutes with leading zeros.
23
 * @property-read  string   $second       s - Seconds with leading zeros.
24
 * @property-read  string   $month        m - Numeric representation of a month, with leading zeros.
25
 * @property-read  string   $ordinal      S - English ordinal suffix for the day of the month, 2 characters.
26
 * @property-read  string   $week         W - Numeric representation of the day of the week.
27
 * @property-read  string   $year         Y - A full numeric representation of a year, 4 digits.
28
 */
29
class DateTime
30
{
31
	/**
32
	 * Getter Interface
33
	 *
34
	 * @var    Getter\GetterInterface
35
	 * @since  2.0.0
36
	 */
37
	private static $getter;
38
39
	/**
40
	 * Parser Interface
41
	 *
42
	 * @var    Parser\ParserInterface
43
	 * @since  2.0.0
44
	 */
45
	private static $parser;
46
47
	/**
48
	 * Since Interface
49
	 *
50
	 * @var    Since\SinceInterface
51
	 * @since  2.0.0
52
	 */
53
	private static $since;
54
55
	/**
56
	 * Translator object
57
	 *
58
	 * @var    Translator\AbstractTranslator
59
	 * @since  2.0.0
60
	 */
61
	private static $translator;
62
63
	/**
64
	 * Strategy Interface
65
	 *
66
	 * @var    Strategy\StrategyInterface
67
	 * @since  2.0.0
68
	 */
69
	private $strategy;
70
71
	/**
72
	 * PHP DateTime object
73
	 *
74
	 * @var    \DateTime
75
	 * @since  2.0.0
76
	 */
77
	private $datetime;
78
79
	/**
80
	 * Constructor.
81
	 *
82
	 * @param   mixed          $datetime  Either a Joomla\Date object, a PHP DateTime object
83
	 *                                    or a string in a format accepted by strtotime().
84
	 * @param   \DateTimeZone  $timezone  The timezone.
85
	 *
86
	 * @since   2.0.0
87
	 */
88 210
	public function __construct($datetime, \DateTimeZone $timezone = null)
89
	{
90 210
		if ($datetime instanceof \DateTime)
91 210
		{
92 198
			$this->datetime = clone $datetime;
93 198
		}
94 48
		elseif ($datetime instanceof Date)
95
		{
96 19
			$this->datetime = $datetime->getDateTime();
97 19
		}
98
		else
99
		{
100 36
			$this->datetime = new \DateTime($datetime);
101
		}
102
103 210
		if (!is_null($timezone))
104 210
		{
105 1
			$this->datetime->setTimezone($timezone);
106 1
		}
107 210
	}
108
109
	/**
110
	 * Parses to DateTime object.
111
	 *
112
	 * @param   string  $name   Name of the parser.
113
	 * @param   mixed   $value  The value to parse.
114
	 *
115
	 * @return  DateTime
116
	 *
117
	 * @since   2.0.0
118
	 */
119 4
	public static function parse($name, $value)
120
	{
121 4
		return static::getParser()->parse($name, $value);
0 ignored issues
show
Bug introduced by
Since getParser() is declared private, calling it with static will lead to errors in possible sub-classes. You can either use self, or increase the visibility of getParser() to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
}

public static function getSomeVariable()
{
    return static::getTemperature();
}

}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass {
      private static function getTemperature() {
        return "-182 °C";
    }
}

print YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
    }

    public static function getSomeVariable()
    {
        return self::getTemperature();
    }
}
Loading history...
122
	}
123
124
	/**
125
	 * Creates a DateTime object from the given format.
126
	 *
127
	 * @param   string         $format    Format accepted by date().
128
	 * @param   string         $time      String representing the time.
129
	 * @param   \DateTimeZone  $timezone  The timezone.
130
	 *
131
	 * @return  DateTime
132
	 *
133
	 * @since   2.0.0
134
	 */
135 37
	public static function createFromFormat($format, $time, \DateTimeZone $timezone = null)
136
	{
137 37
		$datetime = is_null($timezone) ? \DateTime::createFromFormat($format, $time) : \DateTime::createFromFormat($format, $time, $timezone);
138
139 37
		return new static($datetime);
140
	}
141
142
	/**
143
	 * Creates a DateTime object.
144
	 *
145
	 * @param   integer        $year      The year.
146
	 * @param   integer        $month     The month.
147
	 * @param   integer        $day       The day of the month.
148
	 * @param   integer        $hour      The hour.
149
	 * @param   integer        $minute    The minute.
150
	 * @param   integer        $second    The second.
151
	 * @param   \DateTimeZone  $timezone  The timezone.
152
	 *
153
	 * @return  DateTime
154
	 *
155
	 * @since   2.0.0
156
	 */
157 37
	public static function create($year, $month = '01', $day = '01', $hour = '00', $minute = '00', $second = '00', \DateTimeZone $timezone = null)
158
	{
159 37
		$time = sprintf('%04s-%02s-%02s %02s:%02s:%02s', $year, $month, $day, $hour, $minute, $second);
160
161 37
		return static::createFromFormat('Y-m-d H:i:s', $time, $timezone);
162
	}
163
164
	/**
165
	 * Creates a DateTime object with time of the midnight.
166
	 *
167
	 * @param   integer        $year      The year.
168
	 * @param   integer        $month     The month.
169
	 * @param   integer        $day       The day of the month.
170
	 * @param   \DateTimeZone  $timezone  The timezone.
171
	 *
172
	 * @return  DateTime
173
	 *
174
	 * @since   2.0.0
175
	 */
176 26
	public static function createFromDate($year, $month = '01', $day = '01', \DateTimeZone $timezone = null)
177
	{
178 26
		return static::create($year, $month, $day, '00', '00', '00', $timezone);
179
	}
180
181
	/**
182
	 * Creates a DateTime object with date of today.
183
	 *
184
	 * @param   integer        $hour      The hour.
185
	 * @param   integer        $minute    The minute.
186
	 * @param   integer        $second    The second.
187
	 * @param   \DateTimeZone  $timezone  The timezone.
188
	 *
189
	 * @return  DateTime
190
	 *
191
	 * @since   2.0.0
192
	 */
193 5
	public static function createFromTime($hour = '00', $minute = '00', $second = '00', \DateTimeZone $timezone = null)
194
	{
195 5
		return static::create(date('Y'), date('m'), date('d'), $hour, $minute, $second, $timezone);
196
	}
197
198
	/**
199
	 * Creates a DateTime object which represents now.
200
	 *
201
	 * @param   \DateTimeZone  $timezone  The timezone.
202
	 *
203
	 * @return  DateTime
204
	 *
205
	 * @since   2.0.0
206
	 */
207 2
	public static function now(\DateTimeZone $timezone = null)
208
	{
209 2
		return static::createFromTime(date('H'), date('i'), date('s'), $timezone);
210
	}
211
212
	/**
213
	 * Creates a DateTime object which represents today.
214
	 *
215
	 * @param   \DateTimeZone  $timezone  The timezone.
216
	 *
217
	 * @return  DateTime
218
	 *
219
	 * @since   2.0.0
220
	 */
221 23
	public static function today(\DateTimeZone $timezone = null)
222
	{
223 23
		return static::createFromDate(date('Y'), date('m'), date('d'), $timezone);
224
	}
225
226
	/**
227
	 * Creates a DateTime object which represents tomorrow.
228
	 *
229
	 * @param   \DateTimeZone  $timezone  The timezone.
230
	 *
231
	 * @return  DateTime
232
	 *
233
	 * @since   2.0.0
234
	 */
235 11
	public static function tomorrow(\DateTimeZone $timezone = null)
236
	{
237 11
		$today = static::today($timezone);
238
239 11
		return $today->addDays(1);
240
	}
241
242
	/**
243
	 * Creates a DateTime object which represents yesterday.
244
	 *
245
	 * @param   \DateTimeZone  $timezone  The timezone.
246
	 *
247
	 * @return  DateTime
248
	 *
249
	 * @since   2.0.0
250
	 */
251 11
	public static function yesterday(\DateTimeZone $timezone = null)
252
	{
253 11
		$today = static::today($timezone);
254
255 11
		return $today->subDays(1);
256
	}
257
258
	/**
259
	 * Checks if the current date is after the date given as parameter.
260
	 *
261
	 * @param   DateTime  $datetime  The date to compare to.
262
	 *
263
	 * @return  boolean
264
	 *
265
	 * @since   2.0.0
266
	 */
267 224
	public function isAfter(DateTime $datetime)
268
	{
269 224
		return $this->datetime > $datetime->datetime;
270
	}
271
272
	/**
273
	 * Checks if the current date is before the date given as parameter.
274
	 *
275
	 * @param   DateTime  $datetime  The date to compare to.
276
	 *
277
	 * @return  boolean
278
	 *
279
	 * @since   2.0.0
280
	 */
281 96
	public function isBefore(DateTime $datetime)
282
	{
283 96
		return $this->datetime < $datetime->datetime;
284
	}
285
286
	/**
287
	 * Checks if the current date is equals to the date given as parameter.
288
	 *
289
	 * @param   DateTime  $datetime  The date to compare to.
290
	 *
291
	 * @return  boolean
292
	 *
293
	 * @since   2.0.0
294
	 */
295 18
	public function equals(DateTime $datetime)
296
	{
297 18
		return $this->datetime == $datetime->datetime;
298
	}
299
300
	/**
301
	 * Returns the difference between two objects.
302
	 *
303
	 * @param   DateTime  $datetime  The date to compare to.
304
	 * @param   boolean   $absolute  Should the interval be forced to be positive?
305
	 *
306
	 * @return  DateInterval
307
	 *
308
	 * @since   2.0.0
309
	 */
310 144
	public function diff(DateTime $datetime, $absolute = false)
311
	{
312 144
		return new DateInterval($this->datetime->diff($datetime->datetime, $absolute));
313
	}
314
315
	/**
316
	 * Returns a new DateTime object by adding an interval to the current one.
317
	 *
318
	 * @param   DateInterval  $interval  The interval to be added.
319
	 *
320
	 * @return  DateTime
321
	 *
322
	 * @since   2.0.0
323
	 */
324 101
	public function add(DateInterval $interval)
325
	{
326 101
		return $this->modify(
327
			function(\DateTime $datetime) use ($interval)
328
			{
329 101
				$datetime->add($interval->getDateInterval());
330 101
			}
331 101
		);
332
	}
333
334
	/**
335
	 * Returns a new DateTime object by subtracting an interval from the current one.
336
	 *
337
	 * @param   DateInterval  $interval  The interval to be subtracted.
338
	 *
339
	 * @return  DateTime
340
	 *
341
	 * @since   2.0.0
342
	 */
343 97
	public function sub(DateInterval $interval)
344
	{
345 97
		return $this->modify(
346 97
			function(\DateTime $datetime) use ($interval)
347
			{
348 97
				$datetime->sub($interval->getDateInterval());
349 97
			}
350 97
		);
351
	}
352
353
	/**
354
	 * Returns a new DateTime object by adding the specified number of days to the current one.
355
	 *
356
	 * @param   integer  $value  Number of days to be added.
357
	 *
358
	 * @return  DateTime
359
	 *
360
	 * @since   2.0.0
361
	 */
362 35
	public function addDays($value)
363
	{
364 35
		return $this->calc($value, 'P%dD');
365
	}
366
367
	/**
368
	 * Returns a new DateTime object by subtracting the specified number of days from the current one.
369
	 *
370
	 * @param   integer  $value  Number of days to be subtracted.
371
	 *
372
	 * @return  DateTime
373
	 *
374
	 * @since   2.0.0
375
	 */
376 19
	public function subDays($value)
377
	{
378 19
		return $this->addDays(-intval($value));
379
	}
380
381
	/**
382
	 * Returns a new DateTime object by adding the specified number of weeks to the current one.
383
	 *
384
	 * @param   integer  $value  Number of weeks to be added.
385
	 *
386
	 * @return  DateTime
387
	 *
388
	 * @since   2.0.0
389
	 */
390 16
	public function addWeeks($value)
391
	{
392 16
		return $this->calc($value, 'P%dW');
393
	}
394
395
	/**
396
	 * Returns a new DateTime object by subtracting the specified number of weeks from the current one.
397
	 *
398
	 * @param   integer  $value  Number of weeks to be subtracted.
399
	 *
400
	 * @return  DateTime
401
	 *
402
	 * @since   2.0.0
403
	 */
404 8
	public function subWeeks($value)
405
	{
406 8
		return $this->addWeeks(-intval($value));
407
	}
408
409
	/**
410
	 * Returns a new DateTime object by adding the specified number of months to the current one.
411
	 *
412
	 * @param   integer  $value  Number of months to be added.
413
	 *
414
	 * @return  DateTime
415
	 *
416
	 * @since   2.0.0
417
	 */
418 48
	public function addMonths($value)
419
	{
420 48
		return $this->fixMonth($this->calc($value, 'P%dM'));
421
	}
422
423
	/**
424
	 * Returns a new DateTime object by subtracting the specified number of months from the current one.
425
	 *
426
	 * @param   integer  $value  Number of months to be subtracted.
427
	 *
428
	 * @return  DateTime
429
	 *
430
	 * @since   2.0.0
431
	 */
432 34
	public function subMonths($value)
433
	{
434 34
		return $this->addMonths(-intval($value));
435
	}
436
437
	/**
438
	 * Returns a new DateTime object by adding the specified number of years to the current one.
439
	 *
440
	 * @param   integer  $value  Number of years to be added.
441
	 *
442
	 * @return  DateTime
443
	 *
444
	 * @since   2.0.0
445
	 */
446 16
	public function addYears($value)
447
	{
448 16
		return $this->fixMonth($this->calc($value, 'P%dY'));
449
	}
450
451
	/**
452
	 * Returns a new DateTime object by subtracting the specified number of years from the current one.
453
	 *
454
	 * @param   integer  $value  Number of years to be subtracted.
455
	 *
456
	 * @return  DateTime
457
	 *
458
	 * @since   2.0.0
459
	 */
460 8
	public function subYears($value)
461
	{
462 8
		return $this->addYears(-intval($value));
463
	}
464
465
	/**
466
	 * Returns a new DateTime object by adding the specified number of seconds to the current one.
467
	 *
468
	 * @param   integer  $value  Number of seconds to be added.
469
	 *
470
	 * @return  DateTime
471
	 *
472
	 * @since   2.0.0
473
	 */
474 8
	public function addSeconds($value)
475
	{
476 8
		return $this->calc($value, 'PT%dS');
477
	}
478
479
	/**
480
	 * Returns a new DateTime object by subtracting the specified number of seconds from the current one.
481
	 *
482
	 * @param   integer  $value  Number of seconds to be subtracted.
483
	 *
484
	 * @return  DateTime
485
	 *
486
	 * @since   2.0.0
487
	 */
488 4
	public function subSeconds($value)
489
	{
490 4
		return $this->addSeconds(-intval($value));
491
	}
492
493
	/**
494
	 * Returns a new DateTime object by adding the specified number of minutes to the current one.
495
	 *
496
	 * @param   integer  $value  Number of minutes to be added.
497
	 *
498
	 * @return  DateTime
499
	 *
500
	 * @since   2.0.0
501
	 */
502 8
	public function addMinutes($value)
503
	{
504 8
		return $this->calc($value, 'PT%dM');
505
	}
506
507
	/**
508
	 * Returns a new DateTime object by subtracting the specified number of minutes from the current one.
509
	 *
510
	 * @param   integer  $value  Number of minutes to be subtracted.
511
	 *
512
	 * @return  DateTime
513
	 *
514
	 * @since   2.0.0
515
	 */
516 4
	public function subMinutes($value)
517
	{
518 4
		return $this->addMinutes(-intval($value));
519
	}
520
521
	/**
522
	 * Returns a new DateTime object by adding the specified number of hours to the current one.
523
	 *
524
	 * @param   integer  $value  Number of hours to be added.
525
	 *
526
	 * @return  DateTime
527
	 *
528
	 * @since   2.0.0
529
	 */
530 8
	public function addHours($value)
531
	{
532 8
		return $this->calc($value, 'PT%dH');
533
	}
534
535
	/**
536
	 * Returns a new DateTime object by subtracting the specified number of hours from the current one.
537
	 *
538
	 * @param   integer  $value  Number of hours to be subtracted.
539
	 *
540
	 * @return  DateTime
541
	 *
542
	 * @since   2.0.0
543
	 */
544 4
	public function subHours($value)
545
	{
546 4
		return $this->addHours(-intval($value));
547
	}
548
549
	/**
550
	 * Returns a new DateTime object representing the start of the current day.
551
	 *
552
	 * @return  DateTime
553
	 *
554
	 * @since   2.0.0
555
	 */
556 74
	public function startOfDay()
557
	{
558 74
		return $this->modify(array($this->getStrategy(), 'startOfDay'));
559
	}
560
561
	/**
562
	 * Returns a new DateTime object representing the end of the current day.
563
	 *
564
	 * @return  DateTime
565
	 *
566
	 * @since   2.0.0
567
	 */
568 7
	public function endOfDay()
569
	{
570 7
		return $this->modify(array($this->getStrategy(), 'endOfDay'));
571
	}
572
573
	/**
574
	 * Returns a new DateTime object representing the start of the current week.
575
	 *
576
	 * @return  DateTime
577
	 *
578
	 * @since   2.0.0
579
	 */
580 2
	public function startOfWeek()
581
	{
582 2
		$startOfDay = $this->startOfDay();
583
584 2
		return $startOfDay->modify(array($this->getStrategy(), 'startOfWeek'));
585
	}
586
587
	/**
588
	 * Returns a new DateTime object representing the end of the current week.
589
	 *
590
	 * @return  DateTime
591
	 *
592
	 * @since   2.0.0
593
	 */
594 2
	public function endOfWeek()
595
	{
596 2
		$endOfDay = $this->endOfDay();
597
598 2
		return $endOfDay->modify(array($this->getStrategy(), 'endOfWeek'));
599
	}
600
601
	/**
602
	 * Returns a new DateTime object representing the start of the current month.
603
	 *
604
	 * @return  DateTime
605
	 *
606
	 * @since   2.0.0
607
	 */
608 2
	public function startOfMonth()
609
	{
610 2
		$startOfDay = $this->startOfDay();
611
612 2
		return $startOfDay->modify(array($this->getStrategy(), 'startOfMonth'));
613
	}
614
615
	/**
616
	 * Returns a new DateTime object representing the end of the current month.
617
	 *
618
	 * @return  DateTime
619
	 *
620
	 * @since   2.0.0
621
	 */
622 2
	public function endOfMonth()
623
	{
624 2
		$endOfDay = $this->endOfDay();
625
626 2
		return $endOfDay->modify(array($this->getStrategy(), 'endOfMonth'));
627
	}
628
629
	/**
630
	 * Returns a new DateTime object representing the start of the current year.
631
	 *
632
	 * @return  DateTime
633
	 *
634
	 * @since   2.0.0
635
	 */
636 2
	public function startOfYear()
637
	{
638 2
		$startOfDay = $this->startOfDay();
639
640 2
		return $startOfDay->modify(array($this->getStrategy(), 'startOfYear'));
641
	}
642
643
	/**
644
	 * Returns a new DateTime object representing the end of the current year.
645
	 *
646
	 * @return  DateTime
647
	 *
648
	 * @since   2.0.0
649
	 */
650 2
	public function endOfYear()
651
	{
652 2
		$endOfDay = $this->endOfDay();
653
654 2
		return $endOfDay->modify(array($this->getStrategy(), 'endOfYear'));
655
	}
656
657
	/**
658
	 * Returns date formatted according to given format.
659
	 *
660
	 * @param   string  $format  Format accepted by date().
661
	 *
662
	 * @return  string
663
	 *
664
	 * @since   2.0.0
665
	 */
666 88
	public function format($format)
667
	{
668 88
		$replace = array();
669
670
		// Loop all format characters and check if we can translate them.
671 88
		for ($i = 0; $i < strlen($format); $i++)
672
		{
673 88
			$character = $format[$i];
674
675
			// Check if we can replace it with a translated version.
676 88
			if (in_array($character, array('D', 'l', 'F', 'M')))
677 88
			{
678
				switch ($character)
679
				{
680 2
					case 'D':
681 1
						$key = $this->datetime->format('l');
682 1
						break;
683 2
					case 'M':
684 1
						$key = $this->datetime->format('F');
685 1
						break;
686 2
					default:
687 2
						$key = $this->datetime->format($character);
688 2
				}
689
690 2
				$original = $this->datetime->format($character);
691 2
				$translated = $this->getTranslator()->get(strtolower($key));
692
693
				// Short notations.
694 2
				if (in_array($character, array('D', 'M')))
695 2
				{
696 2
					$translated = substr($translated, 0, 3);
697 2
				}
698
699
				// Add to replace list.
700 2
				if ($translated && $original != $translated)
701 2
				{
702 2
					$replace[$original] = $translated;
703 2
				}
704 2
			}
705 88
		}
706
707
		// Replace translations.
708
		if ($replace)
0 ignored issues
show
Bug Best Practice introduced by
The expression $replace of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
709 88
		{
710 2
			return str_replace(array_keys($replace), array_values($replace), $this->datetime->format($format));
711
		}
712
713 88
		return $this->datetime->format($format);
714
	}
715
716
	/**
717
	 * Returns the difference in a human readable format.
718
	 *
719
	 * @param   DateTime  $datetime     The date to compare to. Default is null and this means that
720
	 *                                   the current object will be compared to the current time.
721
	 * @param   integer   $detailLevel  How much details do you want to get.
722
	 *
723
	 * @return  string
724
	 *
725
	 * @since   2.0.0
726
	 */
727 121
	public function since(DateTime $datetime = null, $detailLevel = 1)
728
	{
729 121
		return $this->getSince()->since($this, $datetime, $detailLevel);
730
	}
731
732
	/**
733
	 * Returns the almost difference in a human readable format.
734
	 *
735
	 * @param   DateTime  $datetime  The date to compare to. Default is null and this means that
736
	 *                                the current object will be compared to the current time.
737
	 *
738
	 * @return  string
739
	 *
740
	 * @since   2.0.0
741
	 */
742 22
	public function sinceAlmost(DateTime $datetime = null)
743
	{
744 22
		return $this->getSince()->almost($this, $datetime);
745
	}
746
747
	/**
748
	 * Magic method to access properties of the date given by class to the format method.
749
	 *
750
	 * @param   string  $name  The name of the property.
751
	 *
752
	 * @return  mixed
753
	 *
754
	 * @since   2.0.0
755
	 */
756 30
	public function __get($name)
757
	{
758 30
		return $this->getGetter()->get($this, $name);
759
	}
760
761
	/**
762
	 * Alias for __get.
763
	 *
764
	 * @param   string  $name  The name of the property.
765
	 *
766
	 * @return  mixed
767
	 *
768
	 * @since   2.0.0
769
	 */
770 14
	public function get($name)
771
	{
772 14
		return $this->$name;
773
	}
774
775
	/**
776
	 * Returns the timezone offset.
777
	 *
778
	 * @return  integer
779
	 *
780
	 * @since   2.0.0
781
	 */
782 2
	public function getOffset()
783
	{
784 2
		return $this->datetime->getOffset();
785
	}
786
787
	/**
788
	 * Returns the Unix timestamp representing the date.
789
	 *
790
	 * @return  integer
791
	 *
792
	 * @since   2.0.0
793
	 */
794 1
	public function getTimestamp()
795
	{
796 1
		return $this->datetime->getTimestamp();
797
	}
798
799
	/**
800
	 * Returns a DateTimeZone object.
801
	 *
802
	 * @return  \DateTimeZone
803
	 *
804
	 * @since   2.0.0
805
	 */
806 1
	public function getTimezone()
807
	{
808 1
		return $this->datetime->getTimezone();
809
	}
810
811
	/**
812
	 * Returns a PHP DateTime object.
813
	 *
814
	 * @return  \DateTime
815
	 *
816
	 * @since   2.0.0
817
	 */
818 20
	public function getDateTime()
819
	{
820 20
		return clone $this->datetime;
821
	}
822
823
	/**
824
	 * Sets the Since implementation.
825
	 *
826
	 * @param   Since\SinceInterface  $since  The Since implementation.
827
	 *
828
	 * @return  void
829
	 *
830
	 * @since   2.0.0
831
	 */
832
	public static function setSince(Since\SinceInterface $since)
833
	{
834
		static::$since = $since;
0 ignored issues
show
Bug introduced by
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
835
	}
836
837
	/**
838
	 * Sets the Translator implementation.
839
	 *
840
	 * @param   Translator\AbstractTranslator  $translator  The Translator implementation.
841
	 *
842
	 * @return  void
843
	 *
844
	 * @since   2.0.0
845
	 */
846
	public static function setTranslator(Translator\AbstractTranslator $translator)
847
	{
848
		static::$translator = $translator;
0 ignored issues
show
Bug introduced by
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
849
	}
850
851
	/**
852
	 * Sets the Getter implementation.
853
	 *
854
	 * @param   Getter\GetterInterface  $getter  The Getter implementation.
855
	 *
856
	 * @return  void
857
	 *
858
	 * @since   2.0.0
859
	 */
860 15
	public static function setGetter(Getter\GetterInterface $getter)
861
	{
862 15
		static::$getter = $getter;
0 ignored issues
show
Bug introduced by
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
863 15
	}
864
865
	/**
866
	 * Sets the Parser implementation.
867
	 *
868
	 * @param   Parser\ParserInterface  $parser  The Parser implementation.
869
	 *
870
	 * @return  void
871
	 *
872
	 * @since   2.0.0
873
	 */
874 3
	public static function setParser(Parser\ParserInterface $parser)
875
	{
876 3
		static::$parser = $parser;
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
877 3
	}
878
879
	/**
880
	 * Sets the locale.
881
	 *
882
	 * @param   string  $locale  The locale to set.
883
	 *
884
	 * @return  void
885
	 *
886
	 * @since   2.0.0
887
	 */
888 279
	public static function setLocale($locale)
889
	{
890 279
		static::getTranslator()->setLocale($locale);
891 279
	}
892
893
	/**
894
	 * Gets the Translator implementation.
895
	 *
896
	 * @return  Translator\AbstractTranslator
897
	 *
898
	 * @since   2.0.0
899
	 */
900 281
	public static function getTranslator()
901
	{
902 281
		if (is_null(static::$translator))
0 ignored issues
show
Bug introduced by
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
903 281
		{
904 1
			static::$translator = new Translator\DateTimeTranslator;
0 ignored issues
show
Bug introduced by
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
905 1
		}
906
907 281
		return static::$translator;
0 ignored issues
show
Bug introduced by
Since $translator is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $translator to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
908
	}
909
910
	/**
911
	 * Sets the Strategy implementation.
912
	 *
913
	 * @param   Strategy\StrategyInterface  $strategy  The Strategy implementation.
914
	 *
915
	 * @return  void
916
	 *
917
	 * @since   2.0.0
918
	 */
919
	protected function setStrategy(Strategy\StrategyInterface $strategy)
920
	{
921
		$this->strategy = $strategy;
922
	}
923
924
	/**
925
	 * Gets the Strategy implementation.
926
	 *
927
	 * @return  Strategy\StrategyInterface
928
	 *
929
	 * @since   2.0.0
930
	 */
931 78
	protected function getStrategy()
932
	{
933 78
		if (is_null($this->strategy))
934 78
		{
935 78
			$this->strategy = new Strategy\DateTimeStrategy;
936 78
		}
937
938 78
		return $this->strategy;
939
	}
940
941
	/**
942
	 * Creates a DateTime by adding or subtacting interval.
943
	 *
944
	 * @param   integer  $value   The value for the format.
945
	 * @param   string   $format  The interval_spec for sprintf(), eg. 'P%sD'.
946
	 *
947
	 * @return  DateTime
948
	 *
949
	 * @since   2.0.0
950
	 */
951 131
	private function calc($value, $format)
952
	{
953 131
		$value = intval($value);
954 131
		$spec = sprintf($format, abs($value));
955
956 131
		return $value > 0 ? $this->add(new DateInterval($spec)) : $this->sub(new DateInterval($spec));
957
	}
958
959
	/**
960
	 * Creates a DateTime object by calling the given callable.
961
	 *
962
	 * @param   callable  $callable  The callable with modifications of PHP DateTime object.
963
	 *
964
	 * @return  DateTime
965
	 *
966
	 * @since   2.0.0
967
	 */
968 178
	private function modify($callable)
969
	{
970 178
		$datetime = clone $this->datetime;
971 178
		call_user_func_array($callable, array($datetime));
972
973 178
		return new static($datetime);
974
	}
975
976
	/**
977
	 * If a day has changed, sets the date on the last day of the previous month.
978
	 *
979
	 * @param   DateTime  $result  A result of months or years addition
980
	 *
981
	 * @return  DateTime
982
	 *
983
	 * @since   2.0.0
984
	 */
985 56
	private function fixMonth(DateTime $result)
986
	{
987 56
		if ($result->format('d') != $this->format('d'))
988 56
		{
989 20
			$result = $result->subMonths(1);
990 20
			$result->datetime->setDate($result->format('Y'), $result->format('m'), $result->format('t'));
991 20
		}
992
993 56
		return $result;
994
	}
995
996
	/**
997
	 * Gets the Since implementation.
998
	 *
999
	 * @return  Since\SinceInterface
1000
	 *
1001
	 * @since   2.0.0
1002
	 */
1003 143
	private static function getSince()
1004
	{
1005 143
		if (is_null(static::$since))
0 ignored issues
show
Bug introduced by
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1006 143
		{
1007 1
			static::$since = new Since\DateTimeSince;
0 ignored issues
show
Bug introduced by
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1008 1
		}
1009
1010 143
		return static::$since;
0 ignored issues
show
Bug introduced by
Since $since is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $since to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1011
	}
1012
1013
	/**
1014
	 * Gets the Getter implementation.
1015
	 *
1016
	 * @return  Getter\GetterInterface
1017
	 *
1018
	 * @since   2.0.0
1019
	 */
1020 30
	private static function getGetter()
1021
	{
1022 30
		if (is_null(static::$getter))
0 ignored issues
show
Bug introduced by
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1023 30
		{
1024 1
			static::$getter = new Getter\DateTimeGetter;
0 ignored issues
show
Bug introduced by
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1025 1
		}
1026
1027 30
		return static::$getter;
0 ignored issues
show
Bug introduced by
Since $getter is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $getter to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1028
	}
1029
1030
	/**
1031
	 * Gets the Parser implementation.
1032
	 *
1033
	 * @return  Parser\ParserInterface
1034
	 *
1035
	 * @since   2.0.0
1036
	 */
1037 4
	private static function getParser()
1038
	{
1039 4
		if (is_null(static::$parser))
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1040 4
		{
1041 1
			static::$parser = new Parser\DateTimeParser;
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1042 1
		}
1043
1044 4
		return static::$parser;
0 ignored issues
show
Bug introduced by
Since $parser is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $parser to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
1045
	}
1046
}
1047