Odpowiedzi:
Musisz wstrzyknąć do konstruktora klasy instancję \Magento\Framework\Stdlib\DateTime\DateTime
i użyć tego.
Coś takiego:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Następnie możesz użyć w swojej klasie:
$date = $this->date->gmtDate();
gmtDate
pokazana powyżej akceptuje 2 parametry opcjonalne. Pierwszym z nich jest $format
domyślnie Y-m-d H:i:s
. Możesz po prostu wywołać metodę z gmtDate('H:i:s')
dowolnym parametrem lub dowolnym innym formatem czasu.
Aby uzyskać datę UTC w Magento2, powinieneś użyć\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Powinieneś wstrzyknąć zależność od tej klasy poprzez build, a następnie użyć tej funkcji. Zobacz tę klasę, aby uzyskać więcej metod związanych z datą / czasem.
W przykładowym kodzie pobierasz datę UTC, a nie datę przechowywania. Aby sformatować datę zgodnie ze strefą czasową bieżącego sklepu , użyj
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(ponownie, wstrzykując zależność do skonstruowania)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Możesz łatwo uzyskać aktualną datę \Magento\Framework\Stdlib\DateTime\TimezoneInterface
i godzinę przechowywania, wprowadzając konstruktor klasy na przykład i używając go, aby uzyskać DateObject.
Na przykład:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
A następnie możesz użyć go w następujący sposób:
$date = $this->timezone->formatDate();
Aby uzyskać więcej informacji na temat różnych formatów, zapoznaj się z tym artykułem. Napisałem https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Możemy ustawić strefę czasową sklepu za pomocą obserwatora ze zdarzeniem „controller_action_predispatch”
Utwórz events.xml w folderze 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>
W folderze Observer utwórz plik 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();
}
}
Teraz zamiast daty „UTC”, bierzemy bieżącą datę sklepu za pomocą prostej funkcji daty („Ymd H: i: s”).
Magento 2.x ma obiekty kontekstowe dla różnych klas, jeśli znajdujesz się w kontekście bloku, wówczas obiekt kontekstowy może dać ci obiekt daty locale w następujący sposób:
/**
* 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
);
}
możesz użyć tego w następujący sposób:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Pozwoli to uniknąć błędów podczas wykonywania polecenia di: compile.
Aby uzyskać bieżącą datę i godzinę określonego sklepu (innego niż bieżący sklep w StoreManager):
Referencje od \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
poda Ci datę UTC, datę GMT lub datę bieżącego sklepu.
Magento 2 ustawia UTC w app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
domyślnie korzysta z tego ustawienia strefy czasowej PHP. Magento 2 będzie używać wewnętrznie UTC i zapisuje również w MySQL w UTC. Serwery Linux i MySQL są zwykle ustawione na strefę czasową UTC. Łańcuch ustawień strefy czasowej na serwerze nie jest objęty tym tematem.
Magento 2 wyświetli na interfejsie datę w strefie czasowej bieżącego sklepu przy użyciu przelicznika lokalizacji, \Magento\Framework\Locale\Resolver
aby uzyskać bieżącą strefę czasową sklepu (np Europe/Bruxelles
.).
W moim przypadku, jeśli użyję tego na moim kontrolerze, to nie zadziała. Zamiast tego otrzymuję domyślną datę lokalizacji.
Ale jeśli użyję go na moim bloku, to działa.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');