Source of file DateTime.php
Size: 7,493 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/I18n/Validator/DateTime.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\I18n\Validator; use Locale; use IntlDateFormatter; use Traversable; use Zend\I18n\Exception as I18nException; use Zend\Validator\AbstractValidator; use Zend\Validator\Exception as ValidatorException; class DateTime extends AbstractValidator { const INVALID = 'datetimeInvalid'; const INVALID_DATETIME = 'datetimeInvalidDateTime'; /** * @var array */ protected $messageTemplates = array( self::INVALID => "Invalid type given. String expected", self::INVALID_DATETIME => "The input does not appear to be a valid datetime", ); /** * Optional locale * * @var string|null */ protected $locale; /** * @var int */ protected $dateType; /** * @var int */ protected $timeType; /** * Optional timezone * * @var string */ protected $timezone; /** * @var string */ protected $pattern; /** * @var int */ protected $calendar; /** * @var IntlDateFormatter */ protected $formatter; /** * Is the formatter invalidated * * Invalidation occurs when immutable properties are changed * * @var bool */ protected $invalidateFormatter = false; /** * Constructor for the Date validator * * @param array|Traversable $options * @throws I18nException\ExtensionNotLoadedException if ext/intl is not present */ public function __construct($options = array()) { if (!extension_loaded('intl')) { throw new I18nException\ExtensionNotLoadedException(sprintf( '%s component requires the intl PHP extension', __NAMESPACE__ )); } // Delaying initialization until we know ext/intl is available $this->dateType = IntlDateFormatter::NONE; $this->timeType = IntlDateFormatter::NONE; $this->calendar = IntlDateFormatter::GREGORIAN; parent::__construct($options); if (null === $this->locale) { $this->locale = Locale::getDefault(); } if (null === $this->timezone) { $this->timezone = date_default_timezone_get(); } } /** * Sets the calendar to be used by the IntlDateFormatter * * @param int|null $calendar * @return DateTime provides fluent interface */ public function setCalendar($calendar) { $this->calendar = $calendar; return $this; } /** * Returns the calendar to by the IntlDateFormatter * * @return int */ public function getCalendar() { return ($this->formatter && !$this->invalidateFormatter) ? $this->getIntlDateFormatter()->getCalendar() : $this->calendar; } /** * Sets the date format to be used by the IntlDateFormatter * * @param int|null $dateType * @return DateTime provides fluent interface */ public function setDateType($dateType) { $this->dateType = $dateType; $this->invalidateFormatter = true; return $this; } /** * Returns the date format used by the IntlDateFormatter * * @return int */ public function getDateType() { return $this->dateType; } /** * Sets the pattern to be used by the IntlDateFormatter * * @param string|null $pattern * @return DateTime provides fluent interface */ public function setPattern($pattern) { $this->pattern = $pattern; return $this; } /** * Returns the pattern used by the IntlDateFormatter * * @return string */ public function getPattern() { return ($this->formatter && !$this->invalidateFormatter) ? $this->getIntlDateFormatter()->getPattern() : $this->pattern; } /** * Sets the time format to be used by the IntlDateFormatter * * @param int|null $timeType * @return DateTime provides fluent interface */ public function setTimeType($timeType) { $this->timeType = $timeType; $this->invalidateFormatter = true; return $this; } /** * Returns the time format used by the IntlDateFormatter * * @return int */ public function getTimeType() { return $this->timeType; } /** * Sets the timezone to be used by the IntlDateFormatter * * @param string|null $timezone * @return DateTime provides fluent interface */ public function setTimezone($timezone) { $this->timezone = $timezone; return $this; } /** * Returns the timezone used by the IntlDateFormatter or the system default if none given * * @return string */ public function getTimezone() { return ($this->formatter && !$this->invalidateFormatter) ? $this->getIntlDateFormatter()->getTimeZoneId() : $this->timezone; } /** * Sets the locale to be used by the IntlDateFormatter * * @param string|null $locale * @return DateTime provides fluent interface */ public function setLocale($locale) { $this->locale = $locale; $this->invalidateFormatter = true; return $this; } /** * Returns the locale used by the IntlDateFormatter or the system default if none given * * @return string */ public function getLocale() { return $this->locale; } /** * Returns true if and only if $value is a floating-point value * * @param string $value * @return bool * @throws ValidatorException\InvalidArgumentException */ public function isValid($value) { if (!is_string($value)) { $this->error(self::INVALID); return false; } $this->setValue($value); $formatter = $this->getIntlDateFormatter(); if (intl_is_failure($formatter->getErrorCode())) { throw new ValidatorException\InvalidArgumentException("Invalid locale string given"); } $position = 0; $parsedDate = $formatter->parse($value, $position); if (intl_is_failure($formatter->getErrorCode())) { $this->error(self::INVALID_DATETIME); return false; } if ($position != strlen($value)) { $this->error(self::INVALID_DATETIME); return false; } return true; } /** * Returns a non lenient configured IntlDateFormatter * * @return IntlDateFormatter */ protected function getIntlDateFormatter() { if ($this->formatter == null || $this->invalidateFormatter) { $this->formatter = new IntlDateFormatter($this->getLocale(), $this->getDateType(), $this->getTimeType(), $this->getTimezone(), $this->getCalendar(), $this->getPattern()); $this->formatter->setLenient(false); $this->invalidateFormatter = false; } return $this->formatter; } } |