Risposte:
Devi iniettare un'istanza nel costruttore della tua classe \Magento\Framework\Stdlib\DateTime\DateTime
e usarla.
Qualcosa come questo:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Quindi, puoi utilizzare nella tua classe questo:
$date = $this->date->gmtDate();
gmtDate
mostrato sopra accetta 2 parametri opzionali. Il primo è quello $format
predefinito Y-m-d H:i:s
. Puoi semplicemente chiamare il metodo con il parametro desiderato gmtDate('H:i:s')
o qualsiasi altro formato orario.
Per ottenere la data UTC in Magento2 dovresti usare\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
È necessario iniettare dipendenza da questa classe tramite il costrutto e quindi utilizzare questa funzione. Vedi questa classe per ulteriori metodi relativi a data / ora.
Nell'esempio di codice stai recuperando la data UTC, non la data di archiviazione. Per ottenere la formattazione della data in base al fuso orario dell'archivio corrente , utilizzare
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(di nuovo, iniettando dipendenza per costruire)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
È possibile ottenere facilmente la data del negozio corrente iniettando nel costruttore della classe in istanza \Magento\Framework\Stdlib\DateTime\TimezoneInterface
e usando quello per ottenere l'oggetto DateObject.
Per esempio:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
E poi puoi usarlo come segue:
$date = $this->timezone->formatDate();
Per ulteriori informazioni sui diversi formati puoi dare un'occhiata a questo articolo che ho scritto https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Possiamo impostare il fuso orario del negozio usando l'osservatore con l'evento "controller_action_predispatch"
Crea events.xml nella cartella 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>
Nella cartella Observer creare il file 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();
}
}
Ora invece di ottenere la data "UTC", otteniamo la data del negozio corrente utilizzando la funzione di data semplice ("Ymd H: i: s").
Magento 2.x ha oggetti di contesto per classi diverse, se ti trovi in un contesto di Block, l'oggetto di contesto può darti un oggetto data locale come segue:
/**
* 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
);
}
quindi puoi usarlo come segue:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Ciò eviterà errori durante l'esecuzione del comando di: compile.
Per ottenere l'ora della data corrente di un determinato negozio (diverso dal negozio corrente in StoreManager):
Riferimento da \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
visualizzerà l'ora della data UTC, l'ora della data GMT o l'ora della data del negozio corrente.
Magento 2 imposta UTC in app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
utilizza questa impostazione del fuso orario PHP per impostazione predefinita. Magento 2 utilizzerà internamente UTC e salva anche in MySQL in UTC. I server Linux e MySQL di solito sono impostati sul fuso orario UTC. La catena delle impostazioni del fuso orario su un server non rientra nell'ambito di questo argomento.
Magento 2 visualizzerà sul frontend la data nel fuso orario del negozio corrente usando il risolutore locale \Magento\Framework\Locale\Resolver
per ottenere il fuso orario corrente del negozio (ad es Europe/Bruxelles
.).
Nel mio caso, se lo uso sul mio controller, non funziona. Ottengo invece la data internazionale predefinita.
Ma se lo uso sul mio blocco funziona.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');