ใน Magento 1.x คุณจะได้รับวันเวลาเก็บผ่าน
Mage::getModel('core/date')->gmtDate();
อะไรจะเทียบเท่ากับใน Magento 2.x
ใน Magento 1.x คุณจะได้รับวันเวลาเก็บผ่าน
Mage::getModel('core/date')->gmtDate();
อะไรจะเทียบเท่ากับใน Magento 2.x
คำตอบ:
คุณต้องใช้อินสแตนซ์ของคลาส constructor ของคุณ\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();
คุณควรฉีดพึ่งพาระดับนี้ผ่านการสร้างแล้วใช้ฟังก์ชั่นนี้ ดูคลาสนี้สำหรับวิธีการเพิ่มเติมเกี่ยวกับวันที่ / เวลา
ในตัวอย่างโค้ดของคุณคุณกำลังดึงข้อมูลวันที่ 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/
เราสามารถตั้งค่าเขตเวลาการจัดเก็บโดยใช้ผู้สังเกตการณ์พร้อมเหตุการณ์ "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")
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');