summaryrefslogtreecommitdiffstats
path: root/vendor/ipl/orm/src/Behavior/MillisecondTimestamp.php
blob: 65d8033af4e67bd92deb239da6608f97273d6998 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php

namespace ipl\Orm\Behavior;

use DateTime;
use DateTimeZone;
use Exception;
use ipl\Orm\Contract\PropertyBehavior;
use ipl\Orm\Exception\ValueConversionException;

class MillisecondTimestamp extends PropertyBehavior
{
    public function fromDb($value, $key, $context)
    {
        if ($value === null) {
            return null;
        }

        $datetime = DateTime::createFromFormat('U.u', sprintf('%F', $value / 1000.0));
        $datetime->setTimezone(new DateTimeZone(date_default_timezone_get()));

        return $datetime;
    }

    public function toDb($value, $key, $context)
    {
        if (is_numeric($value)) {
            return (int) ($value * 1000.0);
        }

        if (! $value instanceof DateTime) {
            try {
                $value = new DateTime($value);
            } catch (Exception $err) {
                throw new ValueConversionException(sprintf('Invalid date time format provided: %s', $value));
            }
        }

        return (int) ($value->format('U.u') * 1000.0);
    }
}