回答:
クラスコンストラクターにインスタンスを注入し、そのインスタンスを\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')
必要なパラメーターまたは他の時間形式でメソッドを呼び出すことができます。
Magento2でUTC日付を取得するには、使用する必要があります\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を取得することで、Current Store Date Timeを簡単に取得できます。
例えば:
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」でオブザーバーを使用してストアのタイムゾーンを設定できます
Mymodle / etc / frontend / events.xmlフォルダーに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にはさまざまなクラスのコンテキストオブジェクトがあり、Blockのコンテキストにいる場合、コンテキストオブジェクトは次のようにロケール日付オブジェクトを提供できます。
/**
* 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を使用し、UTCでもMySQLに保存します。通常、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');
以下のソリューションは、Magento 2.1.2 CE&Worksで試しました。
file app\bootstrap.php
に移動します。ここで、uが見つけるファイルの終わりです。
date_default_timezone_set('UTC');
どちらが間違っているか、あなたのものに設定してください
date_default_timezone_set('Asia/Singapore');
を使用して現在の日付を取得
$magentoDateObject = $objectManager->create('Magento\Framework\Stdlib\DateTime\DateTime');
echo $magentoDate = $magentoDateObject->gmtDate();
date_default_timezone_set('UTC')
間違っているのですか?アーキテクチャ的には、デフォルトのTZをUTCに設定してから、必要に応じてストア間で変換するのが理にかなっています。DBの日付と時刻にも同じことが当てはまります。UTCで保存し、必要に応じて変換する方が簡単です。