Magento 2获取当前商店日期时间


25

在Magento 1.x中,您可以通过以下方式获取商店日期时间

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

Magento 2.x中的等效功能是什么?

Answers:


42

您需要在类构造函数中注入的实例\Magento\Framework\Stdlib\DateTime\DateTime并使用该实例。
像这样:

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

然后,您可以在课堂上使用以下代码:

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

1
它为gmt date提供了如何获取当前商店时区的明智日期
ND17 '16

我已经尝试过了,但它总是会提供5个小时的时差。您能帮我吗
Naveenbos

如何获得唯一的时间?
Sanjay Gohil

2
@SanjayGohil。gmtDate上面显示的方法接受2个可选参数。第一个$format默认为Y-m-d H:i:s。您可以仅使用所需的参数gmtDate('H:i:s')或任何其他时间格式来调用该方法。
马里斯(Marius)

如何通过这种方法在日期中添加/减去月份?
Ajwad Syed

18

要在Magento2中获取UTC日期,您应该使用\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

您应该通过构造注入对此类的依赖关系,然后使用此函数。有关更多日期/时间相关方法,请参见此类。

在代码示例中,您正在获取UTC日期,而不是存储日期。要获得根据当前商店时区格式化的日期,请使用 Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(同样,通过注入依赖来构造)


对于当前商店的时区,此功能只给我日期而不是时间,所以我也该如何获取时间?
ND17 '16

看看\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush'2

12

您可以通过在类的实例中插入类构造函数来轻松获取当前存储日期时间,\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/


1
如果我想获得timeZone怎么办?
开发人员Webile

可以使用以下代码获取时区:$ this-> storeManager-> getStore()-> getConfig('general / locale / timezone')。并且其依赖类为\ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh

3

我们可以使用带有事件“ 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”)函数获取当前的存储日期。


2

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命令时出错。


2

要获取特定商店的当前日期时间(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)。


0

就我而言,如果我在控制器上使用此功能,它将无法正常工作。我得到了默认的语言环境日期。

但是,如果我在块上使用它,它将起作用。

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.