Magento 2 Получить текущий магазин Дата Время

25

В Magento 1.x вы можете получить дату магазина через

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

Что будет эквивалентно этому в Magento 2.x?

Эйрик
источник

Ответы:

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 дату, как узнать текущую дату в
часовом
Я пробовал это, но это всегда дает разницу во времени 5 часов, вы можете мне помочь
Naveenbos
Как получить только время?
Санджай Гохил
2
@SanjayGohil. метод, gmtDateпоказанный выше, принимает 2 необязательных параметра. Первый, $formatкоторый по умолчанию Y-m-d H:i:s. Вы можете просто вызвать метод с нужным параметром gmtDate('H:i:s')или любым другим форматом времени.
Мариус
Как сложить / вычесть месяцы в / из даты этим методом?
Аджвад Сайед
18

Чтобы получить дату UTC в Magento2, вы должны использовать\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

Вы должны внедрить зависимость от этого класса через конструкцию и затем использовать эту функцию. См. Этот класс для большего количества связанных с датой / временем методов.

В вашем примере кода вы получаете дату UTC, а не дату магазина. Чтобы получить дату, отформатированную в соответствии с часовым поясом текущего хранилища , используйте Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(опять же, введя зависимость для построения)

Алекс Палиаруш
источник
Для текущего часового пояса магазина эта функция дает мне только дату, а не время, так как же я могу получить время?
ND17
Взгляните на\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Алекс Палиаруш
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,
Раджив Сингх,
3

Мы можем установить часовой пояс магазина с помощью наблюдателя с событием «controller_action_predispatch»

Создайте файл events.xml в папке 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>

В папке 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» мы получаем текущую дату магазина, используя функцию простой даты («Ymd H: i: s»).

Сэчин
источник
2

В Magento 2.x есть объекты контекста для разных классов, если вы находитесь в контексте блока, тогда объект контекста может дать вам объект даты локали следующим образом:

/**
 * 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.

mshakeel
источник
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, время по Гринвичу или время в текущем магазине.

Magento 2 устанавливает UTC в app/bootstrap:

date_default_timezone_set('UTC');

\DateTimeиспользует эту настройку часового пояса PHP по умолчанию. Magento 2 будет использовать внутреннее UTC, а также сохраняет в MySQL в UTC. Для серверов 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');
Диего Санабриа
источник