Magento 2現在のストアの日付と時刻の取得


25

Magento 1.xでは、ストアの日付時刻を取得できます

Mage::getModel('core/date')->gmtDate();

Magento 2.xでこれに相当するものは何ですか?

回答:


43

クラスコンストラクターにインスタンスを注入し、そのインスタンスを\Magento\Framework\Stdlib\DateTime\DateTime使用する必要があります。
このようなもの:

protected $date;
public function __construct(
    ....
    \Magento\Framework\Stdlib\DateTime\DateTime $date,
    ....
) {
    ....
    $this->date = $date;
    ....
}

次に、クラスでこれを使用できます:

$date = $this->date->gmtDate();

1
それは、現在のストアのタイムゾーン賢明な日付を取得する方法をGMT日付を与える
ND17

私はこれを試してみましたが、常に5時間の時差を与えてくれます
-Naveenbos

時間だけを取得するには?
サンジェイゴヒル

2
@sanjayGohil。上記のメソッドgmtDateは、2つのオプションパラメータを受け入れます。最初のものは$formatデフォルトでになりY-m-d H:i:sます。gmtDate('H:i:s')必要なパラメーターまたは他の時間形式でメソッドを呼び出すことができます。
マリウス

この方法で日付に月を追加/減算する方法は?
Ajwad Syed

18

Magento2でUTC日付を取得するには、使用する必要があります\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

コンストラクトを介してこのクラスに依存関係を注入し、この関数を使用する必要があります。日付/時刻に関連するその他のメソッドについては、このクラスを参照してください。

コードサンプルでは、​​保存日ではなくUTC日付を取得しています。現在のストアのタイムゾーンに従って書式設定された日付を取得するには、 Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(再度、構築する依存関係を挿入することにより)


現在のストアのタイムゾーンの場合、この関数は時間ではなく日付のみを提供するので、どのように時間を取得できますか?
ND17

見てください\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
アレックスPaliarush

12

インスタンスにクラスコンストラクターを\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/を書いたこの記事をご覧ください。


1
timeZoneを取得したい場合はどうなりますか?
開発者Webile

このコード$ this-> storeManager-> getStore()-> getConfig( 'general / locale / timezone')を使用してタイムゾーンを取得できます。この依存クラスは\ Magento \ Store \ Model \ StoreManagerInterface $ storeManagerになります
Rajeev Singh

3

イベント「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")関数を使用して現在のストア日付を取得します。


2

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コマンドの実行中のエラーが回避されます。


2

特定のストアの現在の日付時刻を取得するには(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


0

私の場合、コントローラーでこれを使用すると動作しません。代わりにデフォルトのロケール日付を取得します。

しかし、ブロックで使用すると動作します。

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');

-6

以下のソリューションは、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で保存し、必要に応じて変換する方が簡単です。
-nevvermind

1
これは悪いアドバイスです。Magentoは、意図的に日付/時刻値をデータベースにUTCとして保存し、ユーザーに表示するためにストアのローカルタイムゾーンに変換します。
ダレンフェルトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.