Answers:
您需要在类构造函数中注入的实例\Magento\Framework\Stdlib\DateTime\DateTime
并使用该实例。
像这样:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
然后,您可以在课堂上使用以下代码:
$date = $this->date->gmtDate();
gmtDate
上面显示的方法接受2个可选参数。第一个$format
默认为Y-m-d H:i:s
。您可以仅使用所需的参数gmtDate('H:i:s')
或任何其他时间格式来调用该方法。
要在Magento2中获取UTC日期,您应该使用\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
您应该通过构造注入对此类的依赖关系,然后使用此函数。有关更多日期/时间相关方法,请参见此类。
在代码示例中,您正在获取UTC日期,而不是存储日期。要获得根据当前商店的时区格式化的日期,请使用
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(同样,通过注入依赖来构造)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
您可以通过在类的实例中插入类构造函数来轻松获取当前存储日期时间,\Magento\Framework\Stdlib\DateTime\TimezoneInterface
并使用该实例来获取DateObject。
例如:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
然后您可以按以下方式使用它:
$date = $this->timezone->formatDate();
有关不同格式的更多信息,请查看我写的这篇文章https://codeblog.experius.nl/magento-2-get-current-store-date-time/
我们可以使用带有事件“ controller_action_predispatch”的观察者来设置商店时区
在Mymodle / etc / frontend / events.xml文件夹中创建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>
在Observer文件夹中,创建文件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();
}
}
现在,我们不是使用“ UTC”日期,而是使用简单的date(“ Ymd H:i:s”)函数获取当前的存储日期。
Magento 2.x具有用于不同类的上下文对象,如果您位于Block的上下文中,则上下文对象可以为您提供区域设置日期对象,如下所示:
/**
* 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
);
}
那么您可以像下面这样使用它:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
这样可以避免在执行di:compile命令时出错。
要获取特定商店的当前日期时间(StoreManager中的当前商店除外):
参考来自 \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
将为您提供UTC日期时间,GMT日期时间或当前商店的日期时间。
Magento 2在app/bootstrap
以下位置设置UTC :
date_default_timezone_set('UTC');
\DateTime
默认使用此PHP时区设置。Magento 2将在内部使用UTC,并且还将UTC保存在MySQL中。Linux服务器和MySQL服务器通常设置为UTC时区。服务器上的时区设置链不在本主题范围内。
Magento 2将使用语言环境解析器在前端显示当前商店时区中的日期,\Magento\Framework\Locale\Resolver
以获取当前商店时区(例如Europe/Bruxelles
)。