Antworten:
Sie müssen in Ihren Klassenkonstruktor eine Instanz von einfügen \Magento\Framework\Stdlib\DateTime\DateTime
und diese verwenden.
Etwas wie das:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Dann können Sie in Ihrer Klasse Folgendes verwenden:
$date = $this->date->gmtDate();
gmtDate
oben gezeigte Methode akzeptiert 2 optionale Parameter. Die erste ist $format
die Standardeinstellung Y-m-d H:i:s
. Sie können die Methode einfach mit dem gewünschten Parameter gmtDate('H:i:s')
oder einem anderen Zeitformat aufrufen .
Um das UTC-Datum in Magento2 zu erhalten, sollten Sie verwenden\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Sie sollten die Abhängigkeit von dieser Klasse über das Konstrukt einfügen und dann diese Funktion verwenden. In dieser Klasse finden Sie weitere datums- und zeitbezogene Methoden.
In Ihrem Codebeispiel rufen Sie das UTC-Datum ab, nicht das Speicherdatum. Um das Datum gemäß der Zeitzone des aktuellen Speichers zu formatieren , verwenden Sie
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(erneut durch Einfügen der Konstruktionsabhängigkeit)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Sie können auf einfache Weise die aktuelle Speicherdatum-Uhrzeit ermitteln, indem Sie in Ihrem Klassenkonstruktor eine Instanz von \Magento\Framework\Stdlib\DateTime\TimezoneInterface
einfügen und diese verwenden, um das DateObject abzurufen.
Beispielsweise:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
Und dann können Sie es wie folgt verwenden:
$date = $this->timezone->formatDate();
Weitere Informationen zu verschiedenen Formaten finden Sie in diesem Artikel, den ich geschrieben habe: https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Wir können die Zeitzone des Speichers mithilfe des Beobachters mit dem Ereignis "controller_action_predispatch" festlegen.
Erstellen Sie die Datei events.xml im Ordner 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>
Erstellen Sie im Observer-Ordner die Datei 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();
}
}
Anstatt "UTC" -Datum zu erhalten, wird jetzt das aktuelle Speicherdatum mit der einfachen Datumsfunktion ("Ymd H: i: s") ermittelt.
Magento 2.x verfügt über Kontextobjekte für verschiedene Klassen. Wenn Sie sich in einem Kontext von Block befinden, kann das Kontextobjekt das Datumsobjekt des Gebietsschemas wie folgt angeben:
/**
* 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
);
}
dann kannst du es wie folgt benutzen:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Dadurch werden Fehler beim Ausführen des Befehls di: compile vermieden.
So rufen Sie das aktuelle Datum und die Uhrzeit eines bestimmten Geschäfts ab (außer dem aktuellen Geschäft in StoreManager):
Referenz von \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
Sie erhalten die UTC-Datumszeit, die GMT-Datumszeit oder die Datumszeit des aktuellen Geschäfts.
Magento 2 setzt UTC in app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
Verwendet standardmäßig diese PHP-Zeitzoneneinstellung. Magento 2 verwendet intern UTC und speichert in MySQL auch in UTC. Linux-Server und MySQL-Server sind normalerweise auf UTC-Zeitzone eingestellt. Die Kette der Zeitzoneneinstellungen auf einem Server ist nicht Gegenstand dieses Themas.
Magento 2 zeigt am Frontend das Datum in der Zeitzone des aktuellen Geschäfts an. Verwenden Sie dazu den Locale Resolver \Magento\Framework\Locale\Resolver
, um die aktuelle Zeitzone des Geschäfts abzurufen (z Europe/Bruxelles
. B. ).
In meinem Fall, wenn ich dies auf meinem Controller verwende, funktioniert es nicht. Stattdessen erhalte ich das Standarddatum für das Gebietsschema.
Aber wenn ich es auf meinem Block benutze, funktioniert es.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Die folgende Lösung ist, dass ich es in Magento 2.1.2 CE versucht habe und gut funktioniert.
Gehe zur Datei app\bootstrap.php
, hier findest du das Ende der Datei.
date_default_timezone_set('UTC');
Was falsch ist, auf deine eingestellt
date_default_timezone_set('Asia/Singapore');
& Aktuelles Datum abrufen mit
$magentoDateObject = $objectManager->create('Magento\Framework\Stdlib\DateTime\DateTime');
echo $magentoDate = $magentoDateObject->gmtDate();
date_default_timezone_set('UTC')
falsch? Aus architektonischer Sicht ist es sinnvoll, die Standard-TZ auf UTC zu setzen und dann nach Belieben zwischen Geschäften zu konvertieren. Dasselbe gilt für Datum und Uhrzeit in der Datenbank: Dies ist einfacher, wenn Sie sie in UTC speichern und nach Bedarf konvertieren.