Magento 2 Obtener tienda actual Fecha Hora

25

En Magento 1.x puede obtener la hora de la fecha de la tienda a través de

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

¿Cuál sería el equivalente a esto en Magento 2.x?

Eirik
fuente

Respuestas:

42

Necesita inyectar en su constructor de clase una instancia de \Magento\Framework\Stdlib\DateTime\DateTimey usar esa.
Algo como esto:

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

Entonces, puedes usar en tu clase esto:

$date = $this->date->gmtDate();
Marius
fuente
1
le da a gmt fecha cómo obtener la fecha actual de la zona horaria de la tienda
ND17
He intentado esto, pero siempre me da una diferencia horaria de 5 horas. ¿Pueden ayudarme?
Naveenbos
¿Cómo obtener solo tiempo?
Sanjay Gohil
2
@SanjayGohil. El método que se gmtDatemuestra arriba acepta 2 parámetros opcionales. El primero es $formatel predeterminado Y-m-d H:i:s. Puede llamar al método con el parámetro que desee gmtDate('H:i:s')o cualquier otro formato de hora.
Marius
¿Cómo sumar / restar meses a / desde la fecha por este método?
Ajwad Syed
18

Para obtener la fecha UTC en Magento2, debe usar\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

Debe inyectar dependencia en esta clase a través de la construcción y luego usar esta función. Vea esta clase para más métodos relacionados con la fecha / hora.

En su ejemplo de código, está recuperando la fecha UTC, no la fecha de almacenamiento. Para obtener el formato de fecha de acuerdo con la zona horaria de la tienda actual , use Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(nuevamente, inyectando dependencia para construir)

Alex Paliarush
fuente
Para la zona horaria de la tienda actual, esta función solo me da la fecha, no la hora, así que ¿cómo puedo obtener la hora también?
ND17
Echar un vistazo a\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush
12

Puede obtener fácilmente la fecha y hora actual de la tienda inyectando en su constructor de clase, por ejemplo, \Magento\Framework\Stdlib\DateTime\TimezoneInterfacey usarlo para obtener el objeto de fecha.

Por ejemplo:

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

Y luego puedes usarlo de la siguiente manera:

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

Para obtener más información sobre los diferentes formatos, puede consultar este artículo que escribí https://codeblog.experius.nl/magento-2-get-current-store-date-time/

Señor Lewis
fuente
1
¿Qué pasa si quiero obtener timeZone?
Desarrollador Webile
se puede obtener la zona horaria usando este código $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). y la clase de dependencia para esto sería \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh
3

Podemos configurar la zona horaria de la tienda usando el observador con el evento "controller_action_predispatch"

Cree events.xml en la carpeta 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>

En la carpeta Observer, cree el archivo 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();
    }
}

Ahora, en lugar de obtener la fecha "UTC", obtenemos la fecha de la tienda actual utilizando la función simple de fecha ("Ymd H: i: s").

Sachin
fuente
2

Magento 2.x tiene objetos de contexto para diferentes clases, si se encuentra en un contexto de Bloque, el objeto de contexto puede proporcionarle el objeto de fecha local de la siguiente manera:

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

entonces puedes usarlo de la siguiente manera:

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

Esto evitará errores al ejecutar el comando di: compile.

mshakeel
fuente
2

Para obtener la fecha y hora actual de una tienda en particular (que no sea la tienda actual en StoreManager):

Referencia 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 obtendrá la hora UTC, la hora GMT o la hora actual de la tienda.

Magento 2 establece UTC en app/bootstrap:

date_default_timezone_set('UTC');

\DateTimeusa esta configuración de zona horaria de PHP de forma predeterminada. Magento 2 utilizará UTC internamente y también se guardará en MySQL en UTC. Los servidores Linux y los servidores MySQL generalmente están configurados en la zona horaria UTC. La cadena de la configuración de la zona horaria en un servidor no está dentro del alcance de este tema.

Magento 2 mostrará en la interfaz la fecha en la zona horaria de la tienda actual utilizando el solucionador de configuración regional \Magento\Framework\Locale\Resolverpara obtener la zona horaria de la tienda actual (por ejemplo Europe/Bruxelles).

oscuro
fuente
0

En mi caso, si uso esto en mi controlador, no funciona. En su lugar, obtengo la fecha de configuración regional predeterminada.

Pero si lo uso en mi bloque funciona.

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