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?

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

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)


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/


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.


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.


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


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.