Відповіді:
Вам потрібно ввести в конструктор класу примірник \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')
або будь-якого іншого формату часу.
Щоб отримати дату UTC в Magento2, ви повинні використовувати\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Ви повинні вводити залежність від цього класу через construct, а потім використовувати цю функцію. Дивіться цей клас для отримання додаткових методів, пов’язаних з датою / часом.
У вашому зразку коду ви отримуєте дату 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/
Ми можемо встановити збереження часового поясу, використовуючи спостерігач із подією "контролер 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").
У 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.
Щоб отримати поточний час дати певного магазину (крім поточного магазину в 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
).
У моєму випадку, якщо я використовую це на своєму контролері, він не працює. Натомість я отримую дату локалізації за замовчуванням.
Але якщо я використовую його на своєму блоці, він працює.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');