Jawaban:
Anda perlu menyuntikkan konstruktor kelas Anda contoh \Magento\Framework\Stdlib\DateTime\DateTime
dan menggunakannya.
Sesuatu seperti ini:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Kemudian, Anda dapat menggunakan di kelas Anda ini:
$date = $this->date->gmtDate();
gmtDate
ditunjukkan di atas menerima 2 parameter opsional. Yang pertama adalah $format
default Y-m-d H:i:s
. Anda bisa memanggil metode dengan parameter yang Anda inginkan gmtDate('H:i:s')
atau format waktu lainnya.
Untuk mendapatkan tanggal UTC di Magento2, Anda harus menggunakan\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Anda harus menyuntikkan ketergantungan pada kelas ini melalui konstruk dan kemudian menggunakan fungsi ini. Lihat kelas ini untuk metode terkait tanggal / waktu lainnya.
Dalam contoh kode Anda, Anda mengambil tanggal UTC, bukan tanggal toko. Untuk mendapatkan tanggal yang diformat sesuai dengan zona waktu toko saat ini , gunakan
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(lagi, dengan menyuntikkan ketergantungan untuk membangun)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Anda dapat dengan mudah mendapatkan Waktu Tanggal Toko Saat Ini dengan menyuntikkan konstruktor kelas Anda secara instan \Magento\Framework\Stdlib\DateTime\TimezoneInterface
dan menggunakannya untuk mendapatkan DateObject.
Sebagai contoh:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
Dan kemudian Anda dapat menggunakannya sebagai berikut:
$date = $this->timezone->formatDate();
Untuk informasi lebih lanjut tentang berbagai format Anda dapat melihat artikel ini saya menulis https://codeblog.experius.nl/magento-2-get-current-store-date-time/
Kita dapat mengatur zona waktu toko menggunakan pengamat dengan event "controller_action_predispatch"
Buat events.xml di folder 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>
Di folder Observer buat file 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();
}
}
Sekarang alih-alih mendapatkan tanggal "UTC", kami mendapatkan tanggal toko saat ini menggunakan fungsi tanggal sederhana ("Ymd H: i: s").
Magento 2.x memiliki objek konteks untuk kelas yang berbeda, jika Anda berada dalam konteks Blok maka objek konteks dapat memberi Anda objek tanggal lokal sebagai berikut:
/**
* 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
);
}
maka Anda dapat menggunakannya seperti berikut:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Ini akan menghindari kesalahan saat menjalankan perintah di: compile.
Untuk mendapatkan waktu tanggal saat ini dari toko tertentu (selain toko saat ini di StoreManager):
Referensi dari \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
akan memberi Anda waktu tanggal UTC, waktu tanggal GMT atau waktu tanggal toko saat ini.
Magento 2 menyetel UTC ke dalam app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
menggunakan pengaturan zona waktu PHP ini secara default. Magento 2 akan menggunakan UTC internal dan menyimpan di MySQL dalam UTC juga. Server Linux dan server MySQL biasanya diatur ke zona waktu UTC. Rantai pengaturan zona waktu pada server tidak dalam cakupan topik ini.
Magento 2 akan ditampilkan di frontend tanggal di zona waktu toko saat ini menggunakan penyelesai lokal \Magento\Framework\Locale\Resolver
untuk mendapatkan zona waktu toko saat ini (misalnya Europe/Bruxelles
).
Dalam kasus saya, jika saya menggunakan ini pada controller saya, itu tidak berfungsi. Saya mendapatkan tanggal lokal default sebagai gantinya.
Tetapi jika saya menggunakannya di blok saya itu berfungsi.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');