Respostas:
Você precisa injetar no construtor de sua classe uma instância \Magento\Framework\Stdlib\DateTime\DateTime
e usá-la.
Algo assim:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Em seguida, você pode usar em sua classe o seguinte:
$date = $this->date->gmtDate();
gmtDate
mostrado acima aceita 2 parâmetros opcionais. O primeiro é o $format
padrão Y-m-d H:i:s
. Você pode simplesmente chamar o método com o parâmetro desejado gmtDate('H:i:s')
ou qualquer outro formato de hora.
Para obter a data UTC no Magento2, você deve usar\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Você deve injetar dependência nessa classe por meio de construção e, em seguida, usar esta função. Veja esta classe para obter mais métodos relacionados a data / hora.
No seu exemplo de código, você está recuperando a data UTC, não a data da loja. Para obter a data formatada de acordo com o fuso horário do armazenamento atual , use
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(novamente, injetando dependência para construir)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Você pode obter facilmente a Hora atual da data do armazenamento injetando seu construtor de classe na instância \Magento\Framework\Stdlib\DateTime\TimezoneInterface
e usá-lo para obter o DateObject.
Por exemplo:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
E então você pode usá-lo da seguinte maneira:
$date = $this->timezone->formatDate();
Para obter mais informações sobre diferentes formatos, consulte este artigo que escrevi https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Podemos definir o fuso horário da loja usando o observador com o evento "controller_action_predispatch"
Crie events.xml na pasta 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>
Na pasta Observer, crie o arquivo 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();
}
}
Agora, em vez de obter a data "UTC", obtemos a data atual da loja usando a função simples data ("Ymd H: i: s").
O Magento 2.x possui objetos de contexto para diferentes classes, se você estiver em um contexto de Bloco, o objeto de contexto poderá fornecer o objeto de data da localidade da seguinte maneira:
/**
* 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
);
}
então você pode usá-lo da seguinte maneira:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Isso evitará erros ao executar o comando di: compile.
Para obter a data e hora atuais de uma loja específica (que não seja a loja atual no StoreManager):
Referência de \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
você receberá a data e hora UTC, a hora GMT ou a data atual da loja.
O Magento 2 define o UTC em app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
usa essa configuração de fuso horário do PHP por padrão. O Magento 2 usará o UTC internamente e também salvará no MySQL no UTC. Servidores Linux e servidores MySQL geralmente são configurados para o fuso horário UTC. A cadeia de configurações de fuso horário em um servidor não faz parte do escopo deste tópico.
O Magento 2 será exibido na frente da data no fuso horário da loja atual usando o resolvedor de localidade \Magento\Framework\Locale\Resolver
para obter o fuso horário da loja atual (por exemplo Europe/Bruxelles
).
No meu caso, se eu usar isso no meu controlador, ele não funcionará. Em vez disso, recebo a data da localidade padrão.
Mas se eu usá-lo no meu bloco, ele funciona.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');