<?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\i18n; /** * DateTimeExtended is an extended version of the [PHP DateTime class](http://php.net/manual/en/class.datetime.php). * * It provides more accurate handling of date-only values which can not be converted between timezone as * they do not include any time information. * * **Important Note:** This implementation was created to be used by [[Formatter]] internally, it may not behave * as expected when used directly in your code. Normally you should not need to use this class in your application code. * Use the original PHP [DateTime](http://php.net/manual/en/class.datetime.php) class instead. * * @author Carsten Brandt <mail@cebe.cc> * @since 2.0.1 */ class DateTimeExtended extends \DateTime { private $_isDateOnly = false; /** * The DateTimeExtended constructor. * * @param string $time * @param \DateTimeZone $timezone * @return DateTimeExtended * @see http://php.net/manual/en/datetime.construct.php */ public function __construct ($time = 'now', \DateTimeZone $timezone = null) { parent::__construct($time, $timezone); $info = date_parse($time); if ($info['hour'] === false && $info['minute'] === false && $info['second'] === false) { $this->_isDateOnly = true; } else { $this->_isDateOnly = false; } } /** * Parse a string into a new DateTime object according to the specified format * @param string $format Format accepted by date(). * @param string $time String representing the time. * @param \DateTimeZone $timezone A DateTimeZone object representing the desired time zone. * @return DateTimeExtended * @link http://php.net/manual/en/datetime.createfromformat.php */ public static function createFromFormat ($format, $time, $timezone = null) { if (($originalDateTime = parent::createFromFormat($format, $time, $timezone)) === false) { return false; } $info = date_parse_from_format($format, $time); /** @var $dateTime \DateTime */ $dateTime = new static; if ($info['hour'] === false && $info['minute'] === false && $info['second'] === false) { $dateTime->_isDateOnly = true; } else { $dateTime->_isDateOnly = false; } $dateTime->setTimezone($originalDateTime->getTimezone()); $dateTime->setTimestamp($originalDateTime->getTimestamp()); return $dateTime; } public function isDateOnly() { return $this->_isDateOnly; } public function getTimezone() { if ($this->_isDateOnly) { return false; } else { return parent::getTimezone(); } } public function getOffset() { if ($this->_isDateOnly) { return false; } else { return parent::getOffset(); } } }