123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\Stdlib\DateTime;
- use Magento\Framework\App\Config\ScopeConfigInterface;
- use Magento\Framework\App\ScopeInterface;
- use Magento\Framework\App\ScopeResolverInterface;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Framework\Locale\ResolverInterface;
- use Magento\Framework\Phrase;
- /**
- * Timezone library
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Timezone implements TimezoneInterface
- {
- /**
- * @var array
- */
- protected $_allowedFormats = [
- \IntlDateFormatter::FULL,
- \IntlDateFormatter::LONG,
- \IntlDateFormatter::MEDIUM,
- \IntlDateFormatter::SHORT,
- ];
- /**
- * @var string
- */
- protected $_scopeType;
- /**
- * @var ScopeResolverInterface
- */
- protected $_scopeResolver;
- /**
- * @var \Magento\Framework\Stdlib\DateTime
- */
- protected $_dateTime;
- /**
- * @var string
- */
- protected $_defaultTimezonePath;
- /**
- * @var ScopeConfigInterface
- */
- protected $_scopeConfig;
- /**
- * @var ResolverInterface
- */
- protected $_localeResolver;
- /**
- * @param ScopeResolverInterface $scopeResolver
- * @param ResolverInterface $localeResolver
- * @param \Magento\Framework\Stdlib\DateTime $dateTime
- * @param ScopeConfigInterface $scopeConfig
- * @param string $scopeType
- * @param string $defaultTimezonePath
- */
- public function __construct(
- ScopeResolverInterface $scopeResolver,
- ResolverInterface $localeResolver,
- \Magento\Framework\Stdlib\DateTime $dateTime,
- ScopeConfigInterface $scopeConfig,
- $scopeType,
- $defaultTimezonePath
- ) {
- $this->_scopeResolver = $scopeResolver;
- $this->_localeResolver = $localeResolver;
- $this->_dateTime = $dateTime;
- $this->_defaultTimezonePath = $defaultTimezonePath;
- $this->_scopeConfig = $scopeConfig;
- $this->_scopeType = $scopeType;
- }
- /**
- * @inheritdoc
- */
- public function getDefaultTimezonePath()
- {
- return $this->_defaultTimezonePath;
- }
- /**
- * @inheritdoc
- */
- public function getDefaultTimezone()
- {
- return 'UTC';
- }
- /**
- * @inheritdoc
- */
- public function getConfigTimezone($scopeType = null, $scopeCode = null)
- {
- return $this->_scopeConfig->getValue(
- $this->getDefaultTimezonePath(),
- $scopeType ?: $this->_scopeType,
- $scopeCode
- );
- }
- /**
- * @inheritdoc
- */
- public function getDateFormat($type = \IntlDateFormatter::SHORT)
- {
- return (new \IntlDateFormatter(
- $this->_localeResolver->getLocale(),
- $type,
- \IntlDateFormatter::NONE
- ))->getPattern();
- }
- /**
- * @inheritdoc
- */
- public function getDateFormatWithLongYear()
- {
- return preg_replace(
- '/(?<!y)yy(?!y)/',
- 'Y',
- $this->getDateFormat()
- );
- }
- /**
- * @inheritdoc
- */
- public function getTimeFormat($type = \IntlDateFormatter::SHORT)
- {
- return (new \IntlDateFormatter(
- $this->_localeResolver->getLocale(),
- \IntlDateFormatter::NONE,
- $type
- ))->getPattern();
- }
- /**
- * @inheritdoc
- */
- public function getDateTimeFormat($type)
- {
- return $this->getDateFormat($type) . ' ' . $this->getTimeFormat($type);
- }
- /**
- * @inheritdoc
- */
- public function date($date = null, $locale = null, $useTimezone = true, $includeTime = true)
- {
- $locale = $locale ?: $this->_localeResolver->getLocale();
- $timezone = $useTimezone
- ? $this->getConfigTimezone()
- : date_default_timezone_get();
- switch (true) {
- case (empty($date)):
- return new \DateTime('now', new \DateTimeZone($timezone));
- case ($date instanceof \DateTime):
- return $date->setTimezone(new \DateTimeZone($timezone));
- case ($date instanceof \DateTimeImmutable):
- return new \DateTime($date->format('Y-m-d H:i:s'), $date->getTimezone());
- case (!is_numeric($date)):
- $timeType = $includeTime ? \IntlDateFormatter::SHORT : \IntlDateFormatter::NONE;
- $formatter = new \IntlDateFormatter(
- $locale,
- \IntlDateFormatter::SHORT,
- $timeType,
- new \DateTimeZone($timezone)
- );
- $date = $this->appendTimeIfNeeded($date, $includeTime);
- $date = $formatter->parse($date) ?: (new \DateTime($date))->getTimestamp();
- break;
- }
- return (new \DateTime(null, new \DateTimeZone($timezone)))->setTimestamp($date);
- }
- /**
- * @inheritdoc
- */
- public function scopeDate($scope = null, $date = null, $includeTime = false)
- {
- $timezone = $this->_scopeConfig->getValue($this->getDefaultTimezonePath(), $this->_scopeType, $scope);
- $date = new \DateTime(is_numeric($date) ? '@' . $date : $date, new \DateTimeZone($timezone));
- if (!$includeTime) {
- $date->setTime(0, 0, 0);
- }
- return $date;
- }
- /**
- * @inheritdoc
- */
- public function formatDate($date = null, $format = \IntlDateFormatter::SHORT, $showTime = false)
- {
- $formatTime = $showTime ? $format : \IntlDateFormatter::NONE;
- if (!($date instanceof \DateTimeInterface)) {
- $date = new \DateTime($date);
- }
- return $this->formatDateTime($date, $format, $formatTime);
- }
- /**
- * @inheritdoc
- */
- public function scopeTimeStamp($scope = null)
- {
- $timezone = $this->_scopeConfig->getValue($this->getDefaultTimezonePath(), $this->_scopeType, $scope);
- $currentTimezone = @date_default_timezone_get();
- @date_default_timezone_set($timezone);
- $date = date('Y-m-d H:i:s');
- @date_default_timezone_set($currentTimezone);
- return strtotime($date);
- }
- /**
- * @inheritdoc
- */
- public function isScopeDateInInterval($scope, $dateFrom = null, $dateTo = null)
- {
- if (!$scope instanceof ScopeInterface) {
- $scope = $this->_scopeResolver->getScope($scope);
- }
- $scopeTimeStamp = $this->scopeTimeStamp($scope);
- $fromTimeStamp = strtotime($dateFrom);
- $toTimeStamp = strtotime($dateTo);
- if ($dateTo) {
- // fix date YYYY-MM-DD 00:00:00 to YYYY-MM-DD 23:59:59
- $toTimeStamp += 86400;
- }
- $result = false;
- if (!$this->_dateTime->isEmptyDate($dateFrom) && $scopeTimeStamp < $fromTimeStamp) {
- } elseif (!$this->_dateTime->isEmptyDate($dateTo) && $scopeTimeStamp > $toTimeStamp) {
- } else {
- $result = true;
- }
- return $result;
- }
- /**
- * @inheritdoc
- */
- public function formatDateTime(
- $date,
- $dateType = \IntlDateFormatter::SHORT,
- $timeType = \IntlDateFormatter::SHORT,
- $locale = null,
- $timezone = null,
- $pattern = null
- ) {
- if (!($date instanceof \DateTimeInterface)) {
- $date = new \DateTime($date);
- }
- if ($timezone === null) {
- if ($date->getTimezone() == null || $date->getTimezone()->getName() == 'UTC'
- || $date->getTimezone()->getName() == '+00:00'
- ) {
- $timezone = $this->getConfigTimezone();
- } else {
- $timezone = $date->getTimezone();
- }
- }
- $formatter = new \IntlDateFormatter(
- $locale ?: $this->_localeResolver->getLocale(),
- $dateType,
- $timeType,
- $timezone,
- null,
- $pattern
- );
- return $formatter->format($date);
- }
- /**
- * @inheritdoc
- */
- public function convertConfigTimeToUtc($date, $format = 'Y-m-d H:i:s')
- {
- if (!($date instanceof \DateTimeInterface)) {
- if ($date instanceof \DateTimeImmutable) {
- $date = new \DateTime($date->format('Y-m-d H:i:s'), new \DateTimeZone($this->getConfigTimezone()));
- } else {
- $date = new \DateTime($date, new \DateTimeZone($this->getConfigTimezone()));
- }
- } else {
- if ($date->getTimezone()->getName() !== $this->getConfigTimezone()) {
- throw new LocalizedException(
- new Phrase(
- 'The DateTime object timezone needs to be the same as the "%1" timezone in config.',
- $this->getConfigTimezone()
- )
- );
- }
- }
- $date->setTimezone(new \DateTimeZone('UTC'));
- return $date->format($format);
- }
- /**
- * Retrieve date with time
- *
- * @param string $date
- * @param bool $includeTime
- * @return string
- */
- private function appendTimeIfNeeded($date, $includeTime)
- {
- if ($includeTime && !preg_match('/\d{1}:\d{2}/', $date)) {
- $date .= " 0:00am";
- }
- return $date;
- }
- }
|