Magento 2 Obtenir l'heure actuelle de la boutique

25

Dans Magento 1.x, vous pouvez obtenir l'heure de la date du magasin via

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

Quel serait l'équivalent de cela dans Magento 2.x?

Eirik
la source

Réponses:

42

Vous devez injecter dans votre constructeur de classe une instance de \Magento\Framework\Stdlib\DateTime\DateTimeet utiliser celle-ci.
Quelque chose comme ça:

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

Ensuite, vous pouvez utiliser dans votre classe ceci:

$date = $this->date->gmtDate();
Marius
la source
1
il donne la date gmt comment obtenir la date sage du fuseau horaire du magasin actuel
ND17
J'ai essayé cela, mais cela donne toujours un décalage horaire de 5 heures, pouvez-vous m'aider
Naveenbos
Comment obtenir seulement du temps?
Sanjay Gohil
2
@SanjayGohil. la méthode gmtDateindiquée ci-dessus accepte 2 paramètres facultatifs. Le premier est $formatcelui par défaut Y-m-d H:i:s. Vous pouvez simplement appeler la méthode avec le paramètre souhaité gmtDate('H:i:s')ou tout autre format d'heure.
Marius
Comment ajouter / soustraire des mois dans / à partir de la date par cette méthode?
Ajwad Syed
18

Pour obtenir la date UTC dans Magento2, vous devez utiliser\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

Vous devez injecter une dépendance sur cette classe via la construction, puis utiliser cette fonction. Voir cette classe pour plus de méthodes liées à la date / heure.

Dans votre exemple de code, vous récupérez la date UTC, pas la date de stockage. Pour obtenir la date formatée en fonction du fuseau horaire du magasin actuel , utilisez Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(encore une fois, en injectant des dépendances pour construire)

Alex Paliarush
la source
Pour le fuseau horaire du magasin actuel, cette fonction ne me donne que la date et non l'heure, comment puis-je également obtenir l'heure?
ND17
Jetez un oeil à\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush
12

Vous pouvez facilement obtenir la date et l'heure du magasin actuel en injectant dans votre constructeur de classe \Magento\Framework\Stdlib\DateTime\TimezoneInterfaceet en l'utilisant pour obtenir le DateObject.

Par exemple:

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

Et puis vous pouvez l'utiliser comme suit:

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

Pour plus d'informations sur les différents formats, vous pouvez consulter cet article que j'ai écrit https://codeblog.experius.nl/magento-2-get-current-store-date-time/

M. Lewis
la source
1
Et si je veux avoir timeZone ??
Développeur Webile
on peut obtenir le fuseau horaire en utilisant ce code $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). et la classe de dépendance pour cela serait \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh
3

Nous pouvons définir le fuseau horaire du magasin à l'aide de l'observateur avec l'événement "controller_action_predispatch"

Créez events.xml dans le dossier 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>

Dans le dossier Observer, créez le fichier 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();
    }
}

Maintenant, au lieu d'obtenir la date "UTC", nous obtenons la date actuelle du magasin en utilisant la fonction simple date ("Ymd H: i: s").

Sachin
la source
2

Magento 2.x a des objets de contexte pour différentes classes, si vous êtes dans un contexte de bloc, alors l'objet de contexte peut vous donner un objet de date locale comme suit:

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

alors vous pouvez l'utiliser comme suit:

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

Cela évitera les erreurs lors de l'exécution de la commande di: compile.

mshakeel
la source
2

Pour obtenir l'heure de la date actuelle d'un magasin particulier (autre que le magasin actuel dans StoreManager):

Référence de \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 vous obtiendrez l'heure UTC, l'heure GMT ou l'heure actuelle du magasin.

Magento 2 définit UTC dans app/bootstrap:

date_default_timezone_set('UTC');

\DateTimeutilise ce paramètre de fuseau horaire PHP par défaut. Magento 2 utilisera en interne UTC et il enregistre également dans MySQL en UTC. Les serveurs Linux et les serveurs MySQL sont généralement définis sur le fuseau horaire UTC. La chaîne des paramètres de fuseau horaire sur un serveur ne fait pas partie de cette rubrique.

Magento 2 affichera sur le frontend la date dans le fuseau horaire du magasin actuel en utilisant le résolveur de paramètres régionaux \Magento\Framework\Locale\Resolverpour obtenir le fuseau horaire du magasin actuel (par exemple Europe/Bruxelles).

obscur
la source
0

Dans mon cas, si j'utilise ceci sur mon contrôleur, cela ne fonctionne pas. J'obtiens la date locale par défaut à la place.

Mais si je l'utilise sur mon bloc, cela fonctionne.

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Diego Sanabria
la source