Réponses:
Vous devez injecter dans votre constructeur de classe une instance de \Magento\Framework\Stdlib\DateTime\DateTime
et utiliser celle-ci.
Quelque chose comme ça:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Ensuite, vous pouvez utiliser dans votre classe ceci:
$date = $this->date->gmtDate();
gmtDate
indiquée ci-dessus accepte 2 paramètres facultatifs. Le premier est $format
celui par défaut Y-m-d H:i:s
. Vous pouvez simplement appeler la méthode avec le paramètre souhaité gmtDate('H:i:s')
ou tout autre format d'heure.
Pour obtenir la date UTC dans Magento2, vous devez utiliser\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Vous devez injecter une dépendance sur cette classe via la construction, puis utiliser cette fonction. Voir cette classe pour plus de méthodes liées à la date / heure.
Dans votre exemple de code, vous récupérez la date UTC, pas la date de stockage. Pour obtenir la date formatée en fonction du fuseau horaire du magasin actuel , utilisez
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(encore une fois, en injectant des dépendances pour construire)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Vous pouvez facilement obtenir la date et l'heure du magasin actuel en injectant dans votre constructeur de classe \Magento\Framework\Stdlib\DateTime\TimezoneInterface
et en l'utilisant pour obtenir le DateObject.
Par exemple:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
Et puis vous pouvez l'utiliser comme suit:
$date = $this->timezone->formatDate();
Pour plus d'informations sur les différents formats, vous pouvez consulter cet article que j'ai écrit https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Nous pouvons définir le fuseau horaire du magasin à l'aide de l'observateur avec l'événement "controller_action_predispatch"
Créez events.xml dans le dossier 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>
Dans le dossier Observer, créez le fichier 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();
}
}
Maintenant, au lieu d'obtenir la date "UTC", nous obtenons la date actuelle du magasin en utilisant la fonction simple date ("Ymd H: i: s").
Magento 2.x a des objets de contexte pour différentes classes, si vous êtes dans un contexte de bloc, alors l'objet de contexte peut vous donner un objet de date locale comme suit:
/**
* 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
);
}
alors vous pouvez l'utiliser comme suit:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Cela évitera les erreurs lors de l'exécution de la commande di: compile.
Pour obtenir l'heure de la date actuelle d'un magasin particulier (autre que le magasin actuel dans StoreManager):
Référence 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
vous obtiendrez l'heure UTC, l'heure GMT ou l'heure actuelle du magasin.
Magento 2 définit UTC dans app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
utilise ce paramètre de fuseau horaire PHP par défaut. Magento 2 utilisera en interne UTC et il enregistre également dans MySQL en UTC. Les serveurs Linux et les serveurs MySQL sont généralement définis sur le fuseau horaire UTC. La chaîne des paramètres de fuseau horaire sur un serveur ne fait pas partie de cette rubrique.
Magento 2 affichera sur le frontend la date dans le fuseau horaire du magasin actuel en utilisant le résolveur de paramètres régionaux \Magento\Framework\Locale\Resolver
pour obtenir le fuseau horaire du magasin actuel (par exemple Europe/Bruxelles
).
Dans mon cas, si j'utilise ceci sur mon contrôleur, cela ne fonctionne pas. J'obtiens la date locale par défaut à la place.
Mais si je l'utilise sur mon bloc, cela fonctionne.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');