Completed
Push — master ( 7f4fe5...70b2c3 )
by Peter
02:55
created

Comparator::compareYear()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 3
crap 1
1
<?php
2
/**
3
 * GpsLab component.
4
 *
5
 * @author    Peter Gribanov <[email protected]>
6
 * @copyright Copyright (c) 2016, Peter Gribanov
7
 * @license   http://opensource.org/licenses/MIT
8
 */
9
10
namespace GpsLab\Bundle\DateBundle;
11
12
use GpsLab\Bundle\DateBundle\Exception\InvalidCompareOperatorException;
13
14
class Comparator
15
{
16
    const EQ = '=';
17
    const NEQ = '!=';
18
    const LT = '<';
19
    const LTE = '<=';
20
    const GT = '>';
21
    const GTE = '>=';
22
23
    /**
24
     * Synonym for Comparator::compareDateTime().
25
     *
26
     * @param \DateTime $x
27
     * @param string $operator
28
     * @param \DateTime $y
29
     *
30
     * @return bool
31
     */
32 25
    public function compare(\DateTime $x, $operator, \DateTime $y)
33
    {
34 25
        return $this->compareDateTime($x, $operator, $y);
35
    }
36
37
    /**
38
     * Compare date and time.
39
     *
40
     * @param \DateTime $x
41
     * @param string $operator
42
     * @param \DateTime $y
43
     *
44
     * @return bool
45
     */
46 158
    public function compareDateTime(\DateTime $x, $operator, \DateTime $y)
47
    {
48
        switch ($operator) {
49 158
            case self::EQ:
50 158
            case '==':
51 24
                return $x == $y;
52 134
            case self::NEQ:
53 134
            case '<>':
54 24
                return $x != $y;
55 110
            case self::GT:
56 24
                return $x > $y;
57 86
            case self::GTE:
58 24
                return $x >= $y;
59 62
            case self::LT:
60 24
                return $x < $y;
61 38
            case self::LTE:
62 24
                return $x <= $y;
63 14
            default:
64 14
                throw InvalidCompareOperatorException::create($operator);
65 14
        }
66
    }
67
68
    /**
69
     * Compare only date. Not compare time.
70
     *
71
     * @param \DateTime $x
72
     * @param string $operator
73
     * @param \DateTime $y
74
     *
75
     * @return bool
76
     */
77 26
    public function compareDate(\DateTime $x, $operator, \DateTime $y)
78
    {
79 26
        return $this->compareDateTime($this->resetTime($x), $operator, $this->resetTime($y));
80
    }
81
82
    /**
83
     * Compare only time.
84
     *
85
     * @param \DateTime $x
86
     * @param string $operator
87
     * @param \DateTime $y
88
     *
89
     * @return bool
90
     */
91 26
    public function compareTime(\DateTime $x, $operator, \DateTime $y)
92
    {
93 26
        return $this->compareDateTime($this->resetDate($x), $operator, $this->resetDate($y));
94
    }
95
96
    /**
97
     * @param \DateTime $x
98
     * @param string $operator
99
     * @param \DateTime $y
100
     *
101
     * @return bool
102
     */
103 26
    public function compareWeek(\DateTime $x, $operator, \DateTime $y)
104
    {
105 26
        return $this->compareDateTime($this->resetWeek($x), $operator, $this->resetWeek($y));
106
    }
107
108
    /**
109
     * @param \DateTime $x
110
     * @param string $operator
111
     * @param \DateTime $y
112
     *
113
     * @return bool
114
     */
115 26
    public function compareMonth(\DateTime $x, $operator, \DateTime $y)
116
    {
117 26
        return $this->compareDateTime($this->resetMonth($x), $operator, $this->resetMonth($y));
118
    }
119
120
    /**
121
     * @param \DateTime $x
122
     * @param string $operator
123
     * @param \DateTime $y
124
     *
125
     * @return bool
126
     */
127 26
    public function compareYear(\DateTime $x, $operator, \DateTime $y)
128
    {
129 26
        return $this->compareDateTime($this->resetYear($x), $operator, $this->resetYear($y));
130
    }
131
132
    /**
133
     * @param \DateTime $date
134
     *
135
     * @return \DateTime
136
     */
137 26
    protected function resetTime(\DateTime $date)
138
    {
139 26
        $date = clone $date;
140 26
        $date->setTime(0, 0, 0);
141
142 26
        return $date;
143
    }
144
145
    /**
146
     * @param \DateTime $date
147
     *
148
     * @return \DateTime
149
     */
150 26
    protected function resetDate(\DateTime $date)
151
    {
152 26
        $date = clone $date;
153 26
        $date->setDate(1, 1, 1);
154
155 26
        return $date;
156
    }
157
158
    /**
159
     * @param \DateTime $date
160
     *
161
     * @return \DateTime
162
     */
163 26
    protected function resetWeek(\DateTime $date)
164
    {
165 26
        return Util::getMondayThisWeek($date)->setTime(0, 0, 0);
166
    }
167
168
    /**
169
     * @param \DateTime $date
170
     *
171
     * @return \DateTime
172
     */
173 26
    protected function resetMonth(\DateTime $date)
174
    {
175 26
        $date = clone $date;
176 26
        $date->modify('first day of this month')->setTime(0, 0, 0);
177
178 26
        return $date;
179
    }
180
181
    /**
182
     * @param \DateTime $date
183
     *
184
     * @return \DateTime
185
     */
186 26
    protected function resetYear(\DateTime $date)
187
    {
188 26
        $date = clone $date;
189 26
        $date->modify('first day of this year')->setTime(0, 0, 0);
190
191 26
        return $date;
192
    }
193
}
194