diff --git a/app/code/Magento/Newsletter/Model/Queue.php b/app/code/Magento/Newsletter/Model/Queue.php
index efb68fd4243d1..a3279f8c83699 100644
--- a/app/code/Magento/Newsletter/Model/Queue.php
+++ b/app/code/Magento/Newsletter/Model/Queue.php
@@ -7,6 +7,7 @@
use Magento\Framework\App\TemplateTypesInterface;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
+use Magento\Framework\Stdlib\DateTime\Timezone\LocalizedDateToUtcConverterInterface;
/**
* Newsletter queue model.
@@ -117,6 +118,11 @@ class Queue extends \Magento\Framework\Model\AbstractModel implements TemplateTy
*/
private $timezone;
+ /**
+ * @var LocalizedDateToUtcConverterInterface
+ */
+ private $utcConverter;
+
/**
* @param \Magento\Framework\Model\Context $context
* @param \Magento\Framework\Registry $registry
@@ -130,6 +136,7 @@ class Queue extends \Magento\Framework\Model\AbstractModel implements TemplateTy
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
* @param array $data
* @param TimezoneInterface $timezone
+ * @param LocalizedDateToUtcConverterInterface $utcConverter
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
@@ -144,7 +151,8 @@ public function __construct(
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = [],
- TimezoneInterface $timezone = null
+ TimezoneInterface $timezone = null,
+ LocalizedDateToUtcConverterInterface $utcConverter = null
) {
parent::__construct(
$context,
@@ -159,9 +167,10 @@ public function __construct(
$this->_problemFactory = $problemFactory;
$this->_subscribersCollection = $subscriberCollectionFactory->create();
$this->_transportBuilder = $transportBuilder;
- $this->timezone = $timezone ?: \Magento\Framework\App\ObjectManager::getInstance()->get(
- TimezoneInterface::class
- );
+
+ $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
+ $this->timezone = $timezone ?: $objectManager->get(TimezoneInterface::class);
+ $this->utcConverter = $utcConverter ?? $objectManager->get(LocalizedDateToUtcConverterInterface::class);
}
/**
@@ -196,7 +205,7 @@ public function setQueueStartAtByString($startAt)
if ($startAt === null || $startAt == '') {
$this->setQueueStartAt(null);
} else {
- $this->setQueueStartAt($this->timezone->convertConfigTimeToUtc($startAt));
+ $this->setQueueStartAt($this->utcConverter->convertLocalizedDateToUtc($startAt));
}
return $this;
}
diff --git a/app/etc/di.xml b/app/etc/di.xml
index db979f9b76382..282a0af4f46a5 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -146,6 +146,7 @@
+
diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone.php b/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone.php
index 3c2f20fcc186f..cf747bfa2b735 100644
--- a/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone.php
+++ b/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone.php
@@ -85,7 +85,7 @@ public function __construct(
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getDefaultTimezonePath()
{
@@ -93,7 +93,7 @@ public function getDefaultTimezonePath()
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getDefaultTimezone()
{
@@ -101,7 +101,7 @@ public function getDefaultTimezone()
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getConfigTimezone($scopeType = null, $scopeCode = null)
{
@@ -113,7 +113,7 @@ public function getConfigTimezone($scopeType = null, $scopeCode = null)
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getDateFormat($type = \IntlDateFormatter::SHORT)
{
@@ -125,7 +125,7 @@ public function getDateFormat($type = \IntlDateFormatter::SHORT)
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getDateFormatWithLongYear()
{
@@ -137,7 +137,7 @@ public function getDateFormatWithLongYear()
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getTimeFormat($type = \IntlDateFormatter::SHORT)
{
@@ -149,7 +149,7 @@ public function getTimeFormat($type = \IntlDateFormatter::SHORT)
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function getDateTimeFormat($type)
{
@@ -157,7 +157,7 @@ public function getDateTimeFormat($type)
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function date($date = null, $locale = null, $useTimezone = true, $includeTime = true)
{
@@ -191,7 +191,7 @@ public function date($date = null, $locale = null, $useTimezone = true, $include
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function scopeDate($scope = null, $date = null, $includeTime = false)
{
@@ -204,7 +204,7 @@ public function scopeDate($scope = null, $date = null, $includeTime = false)
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function formatDate($date = null, $format = \IntlDateFormatter::SHORT, $showTime = false)
{
@@ -218,7 +218,7 @@ public function formatDate($date = null, $format = \IntlDateFormatter::SHORT, $s
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function scopeTimeStamp($scope = null)
{
@@ -231,7 +231,7 @@ public function scopeTimeStamp($scope = null)
}
/**
- * {@inheritdoc}
+ * @inheritdoc
*/
public function isScopeDateInInterval($scope, $dateFrom = null, $dateTo = null)
{
@@ -257,13 +257,7 @@ public function isScopeDateInInterval($scope, $dateFrom = null, $dateTo = null)
}
/**
- * @param string|\DateTimeInterface $date
- * @param int $dateType
- * @param int $timeType
- * @param string|null $locale
- * @param string|null $timezone
- * @param string|null $pattern
- * @return string
+ * @inheritdoc
*/
public function formatDateTime(
$date,
@@ -299,13 +293,7 @@ public function formatDateTime(
}
/**
- * Convert date from config timezone to Utc.
- * If pass \DateTime object as argument be sure that timezone is the same with config timezone
- *
- * @param string|\DateTimeInterface $date
- * @param string $format
- * @throws LocalizedException
- * @return string
+ * @inheritdoc
*/
public function convertConfigTimeToUtc($date, $format = 'Y-m-d H:i:s')
{
diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone/LocalizedDateToUtcConverter.php b/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone/LocalizedDateToUtcConverter.php
new file mode 100644
index 0000000000000..420fd6e543e07
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone/LocalizedDateToUtcConverter.php
@@ -0,0 +1,74 @@
+timezone = $timezone;
+ $this->localeResolver = $localeResolver;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function convertLocalizedDateToUtc($date)
+ {
+ $configTimezone = $this->timezone->getConfigTimezone();
+ $locale = $this->localeResolver->getLocale();
+
+ $formatter = new \IntlDateFormatter(
+ $locale,
+ \IntlDateFormatter::MEDIUM,
+ \IntlDateFormatter::MEDIUM,
+ $configTimezone
+ );
+
+ $localTimestamp = $formatter->parse($date);
+ $gmtTimestamp = $this->timezone->date($localTimestamp)->getTimestamp();
+ $formattedUniversalTime = date($this->defaultFormat, $gmtTimestamp);
+
+ $date = new \DateTime($formattedUniversalTime, new \DateTimeZone($configTimezone));
+ $date->setTimezone(new \DateTimeZone('UTC'));
+
+ return $date->format($this->defaultFormat);
+ }
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone/LocalizedDateToUtcConverterInterface.php b/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone/LocalizedDateToUtcConverterInterface.php
new file mode 100644
index 0000000000000..d10bd5f2fefb2
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/DateTime/Timezone/LocalizedDateToUtcConverterInterface.php
@@ -0,0 +1,22 @@
+