Magento 2 Uzyskaj bieżącą datę sklepu Data i godzina

25

W Magento 1.x można uzyskać datę sklepu za pośrednictwem

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

Co byłoby równoważne z tym w Magento 2.x?

Eirik
źródło

Odpowiedzi:

42

Musisz wstrzyknąć do konstruktora klasy instancję \Magento\Framework\Stdlib\DateTime\DateTimei 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();
Marius
źródło
1
podaje datę gmt, jak uzyskać mądrą datę bieżącej strefy czasowej sklepu
ND17
Próbowałem tego, ale zawsze daje to różnicę czasu wynoszącą 5 godzin, możesz mi pomóc
Naveenbos
Jak zdobyć tylko czas?
Sanjay Gohil,
2
@SanjayGohil. metoda gmtDatepokazana powyżej akceptuje 2 parametry opcjonalne. Pierwszym z nich jest $formatdomyś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.
Marius
Jak dodawać / odejmować miesiące za pomocą tej metody?
Ajwad Syed
18

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)

Alex Paliarush
źródło
Dla bieżącej strefy czasowej sklepu ta funkcja podaje mi tylko datę, a nie godzinę, więc jak mogę również uzyskać czas?
ND17
Spójrz na\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush
12

Możesz łatwo uzyskać aktualną datę \Magento\Framework\Stdlib\DateTime\TimezoneInterfacei 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/

Pan Lewis
źródło
1
Co jeśli chcę uzyskać strefę czasową?
Deweloper Webile,
strefę czasową można uzyskać za pomocą tego kodu $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). i klasą zależności dla tego byłoby \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh
3

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

Sachin
źródło
2

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.

mshakeel
źródło
2

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

\DateTimedomyś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\Resolveraby uzyskać bieżącą strefę czasową sklepu (np Europe/Bruxelles.).

niejasny
źródło
0

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');
Diego Sanabria
źródło