Test Failed
Branch develop (09cda0)
by Samson
03:06
created

DateTimeFactory   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 83
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 83
rs 10
c 0
b 0
f 0
wmc 5
lcom 0
cbo 2

4 Methods

Rating   Name   Duplication   Size   Complexity  
A now() 0 8 1
A defaultDateTimeZone() 0 8 2
A of() 0 23 1
A fromTimestamp() 0 6 1
1
<?php
2
3
namespace Andegna;
4
5
use Andegna\Converter\ToJdnConverter;
6
use Andegna\Validator\LeapYearValidator;
7
use DateTime as BaseDateTime;
8
use DateTimeZone;
9
10
class DateTimeFactory
11
{
12
    /**
13
     * Create a date time representing now.
14
     *
15
     * @param DateTimeZone|null $dateTimeZone
16
     *
17
     * @return DateTime
18
     */
19
    public static function now(DateTimeZone $dateTimeZone = null)
20
    {
21
        $dateTimeZone = self::defaultDateTimeZone($dateTimeZone);
22
23
        return new DateTime(
24
            new BaseDateTime('now', $dateTimeZone)
25
        );
26
    }
27
28
    /**
29
     * @param $dateTimeZone
30
     *
31
     * @return DateTimeZone
32
     */
33
    protected static function defaultDateTimeZone($dateTimeZone)
34
    {
35
        if (is_null($dateTimeZone)) {
36
            return new DateTimeZone(date_default_timezone_get());
37
        }
38
39
        return $dateTimeZone;
40
    }
41
42
43
    /**
44
     * Create a DateTime of year month day ...
45
     *
46
     * @param int               $year
47
     * @param int               $month
48
     * @param int               $day
49
     * @param int               $hour
50
     * @param int               $minute
51
     * @param int               $second
52
     * @param DateTimeZone|null $dateTimeZone
53
     *
54
     * @return DateTime
55
     */
56
    public static function of(
57
        $year,
58
        $month,
59
        $day,
60
        $hour = 0,
61
        $minute = 0,
62
        $second = 0,
63
        DateTimeZone $dateTimeZone = null
64
    ) {
65
66
        // Convert to Julian Date Number
67
        $jdn = (new ToJdnConverter($day, $month, $year))->getJdn();
68
69
        // The gregorian date in "month/day/year" format
70
        $gregorian = \jdtogregorian($jdn);
71
72
        $dateTimeZone = self::defaultDateTimeZone($dateTimeZone);
73
74
        $base = new BaseDateTime("$gregorian $hour:$minute:$second",
75
            $dateTimeZone);
76
77
        return new DateTime($base);
78
    }
79
80
    /**
81
     * @param $timestamp
82
     *
83
     * @return DateTime
84
     */
85
    public static function fromTimestamp($timestamp)
86
    {
87
        $baseDateTime = new BaseDateTime(date('c', $timestamp));
88
89
        return new DateTime($baseDateTime);
90
    }
91
92
}
93