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, як отримати актуальну дату часового поясу магазину
ND17

Я спробував це, але це завжди дає різницю у часі 5 годин, чи можете ви мені допомогти
Naveenbos

Як отримати лише час?
Санджай Гохіль

2
@SanjayGohil. метод, gmtDateпоказаний вище, приймає 2 необов'язкові параметри. Перший - це те, $formatщо за замовчуванням Y-m-d H:i:s. Ви можете просто викликати метод за допомогою потрібного параметра gmtDate('H:i:s')або будь-якого іншого формату часу.
Маріус

Як за цим методом додати / відняти місяці з / з дати?
Ajwad Syed

18

Щоб отримати дату UTC в Magento2, ви повинні використовувати\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

Ви повинні вводити залежність від цього класу через construct, а потім використовувати цю функцію. Дивіться цей клас для отримання додаткових методів, пов’язаних з датою / часом.

У вашому зразку коду ви отримуєте дату 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 ('загальний / локальний / часовий пояс'). і клас залежності для цього буде \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Раєєв Сінгх

3

Ми можемо встановити збереження часового поясу, використовуючи спостерігач із подією "контролер Managed_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", ми отримуємо поточну дату магазину, використовуючи просту функцію date ("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.


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 встановлює 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');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.