Magento 2 Holen Sie sich das aktuelle Speicherdatum

25

In Magento 1.x können Sie das Speicherdatum und die Uhrzeit über abrufen

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

Was wäre das Äquivalent dazu in Magento 2.x?

Eirik
quelle

Antworten:

43

Sie müssen in Ihren Klassenkonstruktor eine Instanz von einfügen \Magento\Framework\Stdlib\DateTime\DateTimeund 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();
Marius
quelle
1
es gibt gmt-Datum an, wie das aktuelle Speicherzeitzonen-
bezogene
Ich habe es versucht, aber es gibt immer einen Zeitunterschied von 5 Stunden.
Kannst
Wie bekomme ich nur Zeit?
Sanjay Gohil
2
@SanjayGohil. Die gmtDateoben gezeigte Methode akzeptiert 2 optionale Parameter. Die erste ist $formatdie 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 .
Marius
Wie kann ich mit dieser Methode Monate zum / vom Datum addieren / subtrahieren?
Ajwad Syed
18

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)

Alex Paliarush
quelle
Für die aktuelle Zeitzone des Shops gibt diese Funktion nur das Datum und nicht die Uhrzeit an. Wie kann ich die Uhrzeit auch abrufen?
ND17
Sehen Sie sich an\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush
12

Sie können auf einfache Weise die aktuelle Speicherdatum-Uhrzeit ermitteln, indem Sie in Ihrem Klassenkonstruktor eine Instanz von \Magento\Framework\Stdlib\DateTime\TimezoneInterfaceeinfü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/

Mr. Lewis
quelle
1
Was ist, wenn ich timeZone bekommen will?
Entwickler Webile
Mit diesem Code kann die Zeitzone ermittelt werden: $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). und die Abhängigkeitsklasse dafür wäre \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh
3

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.

Sachin
quelle
2

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.

mshakeel
quelle
2

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

\DateTimeVerwendet 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. ).

obskur
quelle
0

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

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();
Ankit Shah
quelle
Warum ist 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.
Nevvermind
1
Das ist ein schlechter Rat. Magento speichert absichtlich Datums- / Zeitwerte in der Datenbank als UTC und konvertiert sie in die lokale Zeitzone des Geschäfts, um sie dem Benutzer anzuzeigen.
Darren Felton