Obter data atual da loja Magento 2

25

No Magento 1.x, você pode obter a hora da data da loja via

Mage::getModel('core/date')->gmtDate();

Qual seria o equivalente a isso no Magento 2.x?

Eirik
fonte

Respostas:

42

Você precisa injetar no construtor de sua classe uma instância \Magento\Framework\Stdlib\DateTime\DateTimee 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();
Marius
fonte
1
dá data GMT como obter loja atual fuso horário data sábio
ND17
Eu tentei isso, mas sempre dando uma diferença de tempo de 5 horas você puder me ajudar
Naveenbos
Como conseguir apenas tempo?
Sanjay Gohil
2
@SanjayGohil. o método gmtDatemostrado acima aceita 2 parâmetros opcionais. O primeiro é o $formatpadrã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.
Marius
Como adicionar / subtrair meses para / a partir da data por esse método?
Ajwad Syed 03/07
18

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)

Alex Paliarush
fonte
Para o fuso horário da loja atual, esta função fornece apenas data e não hora. Como posso obter tempo também?
ND17
Dê uma olhada\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush
12

Você pode obter facilmente a Hora atual da data do armazenamento injetando seu construtor de classe na instância \Magento\Framework\Stdlib\DateTime\TimezoneInterfacee 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/

Sr. Lewis
fonte
1
E se eu quiser obter o timeZone ??
Desenvolvedor Webile
pode-se obter o fuso horário usando este código $ this-> storeManager-> getStore () -> getConfig ('general / locale / fuso horário'). e a classe de dependência para isso seria \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh
3

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").

Sachin
fonte
2

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.

mshakeel
fonte
2

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');

\DateTimeusa 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\Resolverpara obter o fuso horário da loja atual (por exemplo Europe/Bruxelles).

obscurecer
fonte
0

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');
Diego Sanabria
fonte