Completed
Push — master ( 660564...17f31f )
by Andreas
18s queued 10s
created

MongoDate::__toString()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 */
15
16
if (class_exists('MongoDate', false)) {
17
    return;
18
}
19
20
use Alcaeus\MongoDbAdapter\TypeInterface;
21
use MongoDB\BSON\UTCDateTime;
22
23
class MongoDate implements TypeInterface
24
{
25
    /**
26
     * @link http://php.net/manual/en/class.mongodate.php#mongodate.props.sec
27
     * @var int $sec
28
     */
29
    public $sec;
30
31
    /**
32
     * @link http://php.net/manual/en/class.mongodate.php#mongodate.props.usec
33
     * @var int $usec
34
     */
35
    public $usec;
36
37
    /**
38
     * Creates a new date. If no parameters are given, the current time is used.
39
     *
40
     * @link http://php.net/manual/en/mongodate.construct.php
41
     * @param int $sec Number of seconds since January 1st, 1970
42
     * @param int $usec Microseconds
43
     */
44
    public function __construct($sec = 0, $usec = 0)
45
    {
46
        if (func_num_args() == 0) {
47
            $time = microtime(true);
48
            $sec = floor($time);
49
            $usec = ($time - $sec) * 1000000.0;
50
        } elseif ($sec instanceof UTCDateTime) {
51
            $msecString = (string) $sec;
52
53
            $sec = substr($msecString, 0, -3);
54
            $usec = ((int) substr($msecString, -3)) * 1000;
55
        }
56
57
        $this->sec = (int) $sec;
58
        $this->usec = (int) $this->truncateMicroSeconds($usec);
59
    }
60
61
    /**
62
     * Returns a string representation of this date
63
     * @return string
64
     */
65
    public function __toString()
66
    {
67
        return (string) sprintf('%.8f', $this->truncateMicroSeconds($this->usec) / 1000000) . ' ' . $this->sec;
68
    }
69
70
    /**
71
     * Converts this MongoDate to the new BSON UTCDateTime type
72
     *
73
     * @return UTCDateTime
74
     * @internal This method is not part of the ext-mongo API
75
     */
76
    public function toBSONType()
77
    {
78
        $milliSeconds = ($this->sec * 1000) + ($this->truncateMicroSeconds($this->usec) / 1000);
79
80
        return new UTCDateTime($milliSeconds);
81
    }
82
83
    /**
84
     * Returns a DateTime object representing this date
85
     * @link http://php.net/manual/en/mongodate.todatetime.php
86
     * @return DateTime
87
     */
88
    public function toDateTime()
89
    {
90
        $datetime = new \DateTime();
91
        $datetime->setTimestamp($this->sec);
92
93
        $microSeconds = $this->truncateMicroSeconds($this->usec);
94
        if ($microSeconds > 0) {
95
            $datetime = \DateTime::createFromFormat('Y-m-d H:i:s.u', $datetime->format('Y-m-d H:i:s') . '.' . str_pad($microSeconds, 6, '0', STR_PAD_LEFT));
0 ignored issues
show
Comprehensibility Best Practice introduced by
The expression \DateTime::createFromFor...6, '0', STR_PAD_LEFT)); of type DateTime|false adds false to the return on line 100 which is incompatible with the return type documented by MongoDate::toDateTime of type DateTime. It seems like you forgot to handle an error condition.
Loading history...
96
        }
97
98
        $datetime->setTimezone(new \DateTimeZone("UTC"));
99
100
        return $datetime;
101
    }
102
103
    /**
104
     * @param int $usec
105
     * @return int
106
     */
107
    private function truncateMicroSeconds($usec)
108
    {
109
        return (int) floor($usec / 1000) * 1000;
110
    }
111
}
112