xref: /template/strap/ComboStrap/Iso8601Date.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeau
4*37748cd8SNickeaunamespace ComboStrap;
5*37748cd8SNickeau
6*37748cd8SNickeau
7*37748cd8SNickeauuse DateTime;
8*37748cd8SNickeau
9*37748cd8SNickeau
10*37748cd8SNickeau/**
11*37748cd8SNickeau * Class Is8601Date
12*37748cd8SNickeau * @package ComboStrap
13*37748cd8SNickeau * Format used by Google, Sqlite and others
14*37748cd8SNickeau */
15*37748cd8SNickeauclass Iso8601Date
16*37748cd8SNickeau{
17*37748cd8SNickeau    /**
18*37748cd8SNickeau     * @var DateTime|false
19*37748cd8SNickeau     */
20*37748cd8SNickeau    private $dateTime;
21*37748cd8SNickeau
22*37748cd8SNickeau
23*37748cd8SNickeau    /**
24*37748cd8SNickeau     * Date constructor.
25*37748cd8SNickeau     */
26*37748cd8SNickeau    public function __construct($dateTime = null)
27*37748cd8SNickeau    {
28*37748cd8SNickeau
29*37748cd8SNickeau        if ($dateTime == null) {
30*37748cd8SNickeau
31*37748cd8SNickeau            $this->dateTime = new DateTime();
32*37748cd8SNickeau
33*37748cd8SNickeau        } else {
34*37748cd8SNickeau
35*37748cd8SNickeau            $this->dateTime = $dateTime;
36*37748cd8SNickeau
37*37748cd8SNickeau        }
38*37748cd8SNickeau
39*37748cd8SNickeau    }
40*37748cd8SNickeau
41*37748cd8SNickeau    public static function create($string = null)
42*37748cd8SNickeau    {
43*37748cd8SNickeau        if ($string === null) {
44*37748cd8SNickeau            return new Iso8601Date();
45*37748cd8SNickeau        }
46*37748cd8SNickeau
47*37748cd8SNickeau
48*37748cd8SNickeau        /**
49*37748cd8SNickeau         * Time ?
50*37748cd8SNickeau         * (ie only YYYY-MM-DD)
51*37748cd8SNickeau         */
52*37748cd8SNickeau        if (strlen($string) <= 10) {
53*37748cd8SNickeau            /**
54*37748cd8SNickeau             * We had the time to 00:00:00
55*37748cd8SNickeau             * because {@link DateTime::createFromFormat} with a format of
56*37748cd8SNickeau             * Y-m-d will be using the actual time otherwise
57*37748cd8SNickeau             *
58*37748cd8SNickeau             */
59*37748cd8SNickeau            $string .= "T00:00:00";
60*37748cd8SNickeau        }
61*37748cd8SNickeau
62*37748cd8SNickeau        /**
63*37748cd8SNickeau         * Timezone
64*37748cd8SNickeau         */
65*37748cd8SNickeau        if (strlen($string) <= 19) {
66*37748cd8SNickeau            /**
67*37748cd8SNickeau             * Because this text metadata may be used in other part of the application
68*37748cd8SNickeau             * We add the timezone to make it whole
69*37748cd8SNickeau             * And to have a consistent value
70*37748cd8SNickeau             */
71*37748cd8SNickeau            $string .= date('P');
72*37748cd8SNickeau        }
73*37748cd8SNickeau
74*37748cd8SNickeau        /**
75*37748cd8SNickeau         * Date validation
76*37748cd8SNickeau         * Atom is the valid ISO format (and not IS8601 due to backward compatibility)
77*37748cd8SNickeau         *
78*37748cd8SNickeau         * See:
79*37748cd8SNickeau         * https://www.php.net/manual/en/class.datetimeinterface.php#datetime.constants.iso8601
80*37748cd8SNickeau         */
81*37748cd8SNickeau        $dateTime = DateTime::createFromFormat(DateTime::ATOM, $string);
82*37748cd8SNickeau        return new Iso8601Date($dateTime);
83*37748cd8SNickeau    }
84*37748cd8SNickeau
85*37748cd8SNickeau    public static function createFromTimestamp($timestamp)
86*37748cd8SNickeau    {
87*37748cd8SNickeau       $dateTime = new DateTime();
88*37748cd8SNickeau       $dateTime->setTimestamp($timestamp);
89*37748cd8SNickeau        return new Iso8601Date($dateTime);
90*37748cd8SNickeau    }
91*37748cd8SNickeau
92*37748cd8SNickeau    /**
93*37748cd8SNickeau     * And note {@link DATE_ISO8601}
94*37748cd8SNickeau     * because it's not the compliant IS0-8601 format
95*37748cd8SNickeau     * as explained here
96*37748cd8SNickeau     * https://www.php.net/manual/en/class.datetimeinterface.php#datetime.constants.iso8601
97*37748cd8SNickeau     * ATOM is
98*37748cd8SNickeau     *
99*37748cd8SNickeau     * This format is used by Sqlite, Google and is pretty the standard everywhere
100*37748cd8SNickeau     * https://www.w3.org/TR/NOTE-datetime
101*37748cd8SNickeau     */
102*37748cd8SNickeau    public static function getFormat()
103*37748cd8SNickeau    {
104*37748cd8SNickeau        return DATE_ATOM;
105*37748cd8SNickeau    }
106*37748cd8SNickeau
107*37748cd8SNickeau    public function isValidDateEntry()
108*37748cd8SNickeau    {
109*37748cd8SNickeau        if ($this->dateTime !== false) {
110*37748cd8SNickeau            return true;
111*37748cd8SNickeau        } else {
112*37748cd8SNickeau            return false;
113*37748cd8SNickeau        }
114*37748cd8SNickeau    }
115*37748cd8SNickeau
116*37748cd8SNickeau    public function getDateTime()
117*37748cd8SNickeau    {
118*37748cd8SNickeau        return $this->dateTime;
119*37748cd8SNickeau    }
120*37748cd8SNickeau
121*37748cd8SNickeau    public function __toString()
122*37748cd8SNickeau    {
123*37748cd8SNickeau        return $this->getDateTime()->format(self::getFormat());
124*37748cd8SNickeau    }
125*37748cd8SNickeau
126*37748cd8SNickeau    /**
127*37748cd8SNickeau     * Shortcut to {@link DateTime::format()}
128*37748cd8SNickeau     * @param $string
129*37748cd8SNickeau     * @return string
130*37748cd8SNickeau     * @link https://php.net/manual/en/datetime.format.php
131*37748cd8SNickeau     */
132*37748cd8SNickeau    public function format($string)
133*37748cd8SNickeau    {
134*37748cd8SNickeau        return $this->getDateTime()->format($string);
135*37748cd8SNickeau    }
136*37748cd8SNickeau
137*37748cd8SNickeau
138*37748cd8SNickeau}
139