Câu trả lời:
Bạn cần tiêm vào hàm tạo của lớp của bạn một thể hiện \Magento\Framework\Stdlib\DateTime\DateTime
và sử dụng cái đó.
Một cái gì đó như thế này:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Sau đó, bạn có thể sử dụng trong lớp của bạn này:
$date = $this->date->gmtDate();
gmtDate
hiển thị ở trên chấp nhận 2 tham số tùy chọn. Đầu tiên là $format
mặc định Y-m-d H:i:s
. Bạn chỉ có thể gọi phương thức với tham số bạn muốn gmtDate('H:i:s')
hoặc bất kỳ định dạng thời gian nào khác.
Để có được ngày UTC trong Magento2, bạn nên sử dụng\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Bạn nên tiêm phụ thuộc vào lớp này thông qua cấu trúc và sau đó sử dụng hàm này. Xem lớp này để biết thêm các phương pháp liên quan đến ngày / giờ.
Trong mẫu mã của bạn, bạn đang truy xuất ngày UTC, không phải ngày lưu trữ. Để có được định dạng ngày theo múi giờ của cửa hàng hiện tại , hãy sử dụng
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(một lần nữa, bằng cách thêm phụ thuộc vào cấu trúc)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Bạn có thể dễ dàng lấy Thời gian ngày lưu trữ hiện tại bằng cách thêm vào trình xây dựng lớp của mình \Magento\Framework\Stdlib\DateTime\TimezoneInterface
và sử dụng cái đó để lấy DateObject.
Ví dụ:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
Và sau đó bạn có thể sử dụng nó như sau:
$date = $this->timezone->formatDate();
Để biết thêm thông tin về các định dạng khác nhau, bạn có thể xem bài viết này tôi đã viết https://codeblog.experius.nl/magento-2-get-civerse-store-date-time/
Chúng tôi có thể đặt múi giờ lưu trữ bằng cách sử dụng trình quan sát với sự kiện "control_action_predispatch"
Tạo sự kiện trong thư mục Mymodle / etc / frontend / event.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>
Trong thư mục Observer tạo tệp 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();
}
}
Bây giờ thay vì nhận ngày "UTC", chúng tôi nhận được ngày lưu trữ hiện tại bằng cách sử dụng chức năng ngày đơn giản ("Ymd H: i: s").
Magento 2.x có các đối tượng ngữ cảnh cho các lớp khác nhau, nếu bạn ở trong ngữ cảnh của Khối thì đối tượng ngữ cảnh có thể cung cấp cho bạn đối tượng ngày địa phương như sau:
/**
* 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
);
}
sau đó bạn có thể sử dụng nó như sau:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Điều này sẽ tránh lỗi trong khi thực hiện lệnh di: compile.
Để có được thời gian ngày hiện tại của một cửa hàng cụ thể (trừ cửa hàng hiện tại trong StoreManager):
Tham khảo từ \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
sẽ giúp bạn có thời gian ngày UTC, giờ GMT hoặc giờ ngày của cửa hàng hiện tại.
Magento 2 bộ UTC trong app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
sử dụng cài đặt múi giờ PHP này theo mặc định. Magento 2 sẽ sử dụng UTC nội bộ và nó cũng lưu trong MySQL trong UTC. Máy chủ Linux và máy chủ MySQL thường được đặt thành múi giờ UTC. Chuỗi các cài đặt múi giờ trên máy chủ không thuộc phạm vi của chủ đề này.
Magento 2 sẽ hiển thị vào ngày trước trong múi giờ của cửa hàng hiện tại bằng cách sử dụng trình phân giải ngôn ngữ \Magento\Framework\Locale\Resolver
để lấy múi giờ của cửa hàng hiện tại (ví dụ Europe/Bruxelles
).
Trong trường hợp của tôi, nếu tôi sử dụng điều này trên bộ điều khiển của mình, nó không hoạt động. Tôi nhận được ngày địa phương mặc định thay thế.
Nhưng nếu tôi sử dụng nó trên khối của tôi, nó hoạt động.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Giải pháp dưới đây là tôi đã thử trong Magento 2.1.2 CE & Hoạt động tốt.
Đi đến tập tin app\bootstrap.php
, ở đây cuối tập tin bạn sẽ tìm thấy.
date_default_timezone_set('UTC');
Cái nào sai, đặt cho cái của bạn
date_default_timezone_set('Asia/Singapore');
& Nhận ngày hiện tại bằng cách sử dụng
$magentoDateObject = $objectManager->create('Magento\Framework\Stdlib\DateTime\DateTime');
echo $magentoDate = $magentoDateObject->gmtDate();
date_default_timezone_set('UTC')
sai? Về mặt kiến trúc, sẽ hợp lý khi đặt TZ mặc định của bạn thành UTC, sau đó chuyển đổi giữa các cửa hàng theo ý muốn. Điều tương tự cũng áp dụng cho ngày & giờ trong DB: dễ dàng hơn nếu bạn lưu trữ chúng trong UTC và chuyển đổi theo nhu cầu.