Respuestas:
Necesita inyectar en su constructor de clase una instancia de \Magento\Framework\Stdlib\DateTime\DateTime
y 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();
gmtDate
muestra arriba acepta 2 parámetros opcionales. El primero es $format
el 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.
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)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Puede obtener fácilmente la fecha y hora actual de la tienda inyectando en su constructor de clase, por ejemplo, \Magento\Framework\Stdlib\DateTime\TimezoneInterface
y 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/
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").
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.
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');
\DateTime
usa 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\Resolver
para obtener la zona horaria de la tienda actual (por ejemplo Europe/Bruxelles
).
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');