Ответы:
Вам нужно внедрить в ваш конструктор класса экземпляр \Magento\Framework\Stdlib\DateTime\DateTime
и использовать его.
Что-то вроде этого:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Затем вы можете использовать в своем классе это:
$date = $this->date->gmtDate();
gmtDate
показанный выше, принимает 2 необязательных параметра. Первый, $format
который по умолчанию Y-m-d H:i:s
. Вы можете просто вызвать метод с нужным параметром gmtDate('H:i:s')
или любым другим форматом времени.
Чтобы получить дату UTC в Magento2, вы должны использовать\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Вы должны внедрить зависимость от этого класса через конструкцию и затем использовать эту функцию. См. Этот класс для большего количества связанных с датой / временем методов.
В вашем примере кода вы получаете дату UTC, а не дату магазина. Чтобы получить дату, отформатированную в соответствии с часовым поясом текущего хранилища , используйте
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(опять же, введя зависимость для построения)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Вы можете легко получить текущее время хранения в хранилище, вставив в ваш конструктор класса экземпляр \Magento\Framework\Stdlib\DateTime\TimezoneInterface
и использовать его для получения DateObject.
Например:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
И тогда вы можете использовать его следующим образом:
$date = $this->timezone->formatDate();
Для получения дополнительной информации о различных форматах вы можете взглянуть на эту статью, которую я написал https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Мы можем установить часовой пояс магазина с помощью наблюдателя с событием «controller_action_predispatch»
Создайте файл events.xml в папке Mymodle / etc / frontend / events.xml.
<?xml version="1.0" encoding="UTF-8"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_predispatch">
<observer name="mymodule_timezone_set" instance="MyNamespace\Mymodule\Observer\SetStoreTimezoneObserver" />
</event> </config>
В папке Observer создайте файл SetStoreTimezoneObserver.php
<?php
namespace MyNamespace\Mymodule\Observer;
use Magento\Framework\Event\ObserverInterface;
class SetStoreTimezoneObserver implements ObserverInterface
{
protected $_storeTime;
protected $_storeManager;
public function __construct(
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
\Magento\Store\Model\StoreManagerInterface $storeManager
)
{
$this->_storeTime = $timezone;
$this->_storeManager = $storeManager;
$this->setStoreTimezone();
}
/**
* Retrieve store model instance
*
* @return \Magento\Store\Model\Store
*/
public function getStore()
{
return $this->_storeManager->getStore();
}
/*
* Set Store Timezone
*/
public function setStoreTimezone()
{
date_default_timezone_set(
$this->_storeTime->getConfigTimezone('store', $this->getStore())
);
}
/**
* Predispath admin action controller
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$this->setStoreTimezone();
}
}
Теперь вместо получения даты «UTC» мы получаем текущую дату магазина, используя функцию простой даты («Ymd H: i: s»).
В Magento 2.x есть объекты контекста для разных классов, если вы находитесь в контексте блока, тогда объект контекста может дать вам объект даты локали следующим образом:
/**
* Locale Date/Timezone
* @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface
*/
protected $_timezone;
/**
* @param \Magento\Catalog\Block\Product\Context $context
* @param array $data
*/
public function __construct(
\Magento\Catalog\Block\Product\Context $context,
array $data = []
) {
$this->_timezone = $context->getLocaleDate();
parent::__construct(
$context,
$data
);
}
тогда вы можете использовать его следующим образом:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Это позволит избежать ошибок при выполнении команды di: compile.
Чтобы получить текущую дату и время определенного магазина (кроме текущего магазина в StoreManager):
Ссылка от \Magento\Framework\Stdlib\DateTime\Timezone::convertConfigTimeToUtc()
/** @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone */
/** @var \Magento\Framework\Stdlib\DateTime\Timezone $timezone */
$timezone = $this->timezone->getConfigTimezone(\Magento\Store\Model\ScopeInterface::SCOPE_STORES, $storeId);
$currentDate = new \DateTime('now', new \DateTimeZone($timezone));
var_dump($currentDate->format('Y-m-d H:i:s'));
\Magento\Framework\Stdlib\DateTime
Вы получите время в формате UTC, время по Гринвичу или время в текущем магазине.
Magento 2 устанавливает UTC в app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
использует эту настройку часового пояса PHP по умолчанию. Magento 2 будет использовать внутреннее UTC, а также сохраняет в MySQL в UTC. Для серверов Linux и MySQL обычно устанавливается часовой пояс UTC. Цепочка настроек часового пояса на сервере выходит за рамки этого раздела.
Magento 2 будет отображать во внешнем интерфейсе дату в часовом поясе текущего магазина с использованием средства распознавания локали \Magento\Framework\Locale\Resolver
для получения текущего часового пояса магазина (например Europe/Bruxelles
).
В моем случае, если я использую это на моем контроллере, это не работает. Вместо этого я получаю дату локали по умолчанию.
Но если я использую это на своем блоке, это работает.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');