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