Magento 2 Ottieni ora data negozio corrente


25

In Magento 1.x è possibile ottenere l'ora della data del negozio tramite

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

Quale sarebbe l'equivalente di questo in Magento 2.x?

Risposte:


42

Devi iniettare un'istanza nel costruttore della tua classe \Magento\Framework\Stdlib\DateTime\DateTimee usarla.
Qualcosa come questo:

protected $date;
public function __construct(
    ....
    \Magento\Framework\Stdlib\DateTime\DateTime $date,
    ....
) {
    ....
    $this->date = $date;
    ....
}

Quindi, puoi utilizzare nella tua classe questo:

$date = $this->date->gmtDate();

1
dà a gmt date come ottenere la data saggia del fuso orario attuale del negozio
ND17

Ho provato questo, ma con una differenza oraria di 5 ore puoi aiutarmi
Naveenbos

Come ottenere solo tempo?
Sanjay Gohil,

2
@SanjayGohil. il metodo gmtDatemostrato sopra accetta 2 parametri opzionali. Il primo è quello $formatpredefinito Y-m-d H:i:s. Puoi semplicemente chiamare il metodo con il parametro desiderato gmtDate('H:i:s')o qualsiasi altro formato orario.
Marius

Come aggiungere / sottrarre mesi alla / dalla data con questo metodo?
Ajwad Syed

18

Per ottenere la data UTC in Magento2 dovresti usare\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

È necessario iniettare dipendenza da questa classe tramite il costrutto e quindi utilizzare questa funzione. Vedi questa classe per ulteriori metodi relativi a data / ora.

Nell'esempio di codice stai recuperando la data UTC, non la data di archiviazione. Per ottenere la formattazione della data in base al fuso orario dell'archivio corrente , utilizzare Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(di nuovo, iniettando dipendenza per costruire)


Per l'attuale fuso orario del negozio questa funzione mi dà solo la data e non l'ora, quindi come posso ottenere anche il tempo?
ND17,

Dai un'occhiata a\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush,

12

È possibile ottenere facilmente la data del negozio corrente iniettando nel costruttore della classe in istanza \Magento\Framework\Stdlib\DateTime\TimezoneInterfacee usando quello per ottenere l'oggetto DateObject.

Per esempio:

protected $timezone;
public function __construct(
    ....
    \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
    ....
) {
    ....
    $this->timezone = $timezone;
    ....
}

E poi puoi usarlo come segue:

$date = $this->timezone->formatDate();

Per ulteriori informazioni sui diversi formati puoi dare un'occhiata a questo articolo che ho scritto https://codeblog.experius.nl/magento-2-get-current-store-date-time/


1
E se volessi ottenere timeZone ??
Sviluppatore Webile

si può ottenere il fuso orario usando questo codice $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). e la classe di dipendenza per questo sarebbe \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh

3

Possiamo impostare il fuso orario del negozio usando l'osservatore con l'evento "controller_action_predispatch"

Crea events.xml nella cartella 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>

Nella cartella Observer creare il file 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();
    }
}

Ora invece di ottenere la data "UTC", otteniamo la data del negozio corrente utilizzando la funzione di data semplice ("Ymd H: i: s").


2

Magento 2.x ha oggetti di contesto per classi diverse, se ti trovi in ​​un contesto di Block, l'oggetto di contesto può darti un oggetto data locale come segue:

/**
 * 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
    );
}

quindi puoi usarlo come segue:

$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');

Ciò eviterà errori durante l'esecuzione del comando di: compile.


2

Per ottenere l'ora della data corrente di un determinato negozio (diverso dal negozio corrente in StoreManager):

Riferimento da \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 visualizzerà l'ora della data UTC, l'ora della data GMT o l'ora della data del negozio corrente.

Magento 2 imposta UTC in app/bootstrap:

date_default_timezone_set('UTC');

\DateTimeutilizza questa impostazione del fuso orario PHP per impostazione predefinita. Magento 2 utilizzerà internamente UTC e salva anche in MySQL in UTC. I server Linux e MySQL di solito sono impostati sul fuso orario UTC. La catena delle impostazioni del fuso orario su un server non rientra nell'ambito di questo argomento.

Magento 2 visualizzerà sul frontend la data nel fuso orario del negozio corrente usando il risolutore locale \Magento\Framework\Locale\Resolverper ottenere il fuso orario corrente del negozio (ad es Europe/Bruxelles.).


0

Nel mio caso, se lo uso sul mio controller, non funziona. Ottengo invece la data internazionale predefinita.

Ma se lo uso sul mio blocco funziona.

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.