Magento 2-現在の日付を取得するためのベストプラクティス


8

updated_atカスタムエンティティの属性を保存し、Magento 2がそれをどのように処理するかを調べたベストプラクティスを知る必要があります。

私は\Magento\Eav\Model\Entity\Attribute\Backend\Time\Updated属性バックエンドモデルクラスを見て、ここにコードがあります:

public function beforeSave($object)
{
    $object->setData(
        $this->getAttribute()->getAttributeCode(),
        (new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT)
    );
    return $this;
}

私の最初の疑問は、どのタイムゾーンが考慮に入れられるかです。

DateTimeコンストラクタのシグネチャは次のとおりです。

public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )

コンストラクタのドキュメントによると:

$ timezoneを省略すると、現在のタイムゾーンが使用されます。

現在のタイムゾーンはサーバーレベルで構成されているタイムゾーンだと思います。

それを証明するには、次のPHPスニペットを実行します。

<?php
var_dump(new DateTime());

期待される結果は次のとおりです。

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2016-05-10 12:47:11.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(11) "Europe/Rome"
}

Europe/Romeタイムゾーンは、ローカルに自分のサーバー上に構成された一つです。

しかし、Magento 1はGMT 0に従って日付と時刻を保存するために使用されたため、このアプローチがMagento 2で変更されたことを確認するために、私がを開い\Magento\Eav\Model\Entity\Attribute\Backend\Time\Createdたところ、驚きがありました。

public function beforeSave($object)
{
    $attributeCode = $this->getAttribute()->getAttributeCode();
    if ($object->isObjectNew() && $object->getData($attributeCode) === null) {
        //$object->setData($attributeCode, $this->dateTime->gmtDate());
        $object->setData($attributeCode, gmdate('Y-m-d H:i:s'));
    }

    return $this;
}

created_atEAVエンティティの属性は、GMT 0タイムゾーンに従って保存されているようです。updated_atローカルタイムゾーンに応じて。

さらに、Createdバックエンドモデルには2つのアプローチがあり、そのうちの1つはコメントされています。

最善のアプローチのための私の研究はあなたの助けを必要とします。ありがとうございました


あなたのgithubの問題が何の返答もなかったなんて信じられません:-(
peedee

回答:


3

これは非常に単純です。\ DateTimeオブジェクトには常にタイムゾーンが含まれているため、いつでもUTCに変換できますが、Magento 2.0のコードベースでは対応できません。変換を行うデータベース接続でこのコアメソッドを確認します ご覧のとおり、内部的に\ Magento \ Framework \ Stdlib \ DateTimeを呼び出して時間をテキスト表現に変換します。残念ながらタイムゾーンの変換は行われません。

すべてのストアビューに独自のタイムゾーンを設定できるため、日付を常にUTCで維持する必要があるため、バグレポートを投稿して、その問題を修正することをお勧めします。

理想的には、他の最新のPHP ORMと同様に、\ DateTimeオブジェクトを指定するだけでよく、それが格納される残りの部分はライブラリ自体によって処理される必要があります。ビジネスロジックの開発者は、タイムゾーン変換について心配する必要はありません。

私の意見では、\ Magento \ Farameworkは、データベースにデータを保存するときに、非UTCタイムゾーンのすべての\ DateTimeオブジェクトをUTCタイムゾーンに変換し、フロントエンドで現在構成されているタイムゾーンを変更するだけです。同様に、すべてのフィルタリングでは、データベースフィルタリングではなく、datetimeオブジェクトをUTCに変換する必要があります。


私は実験をした:私は、Magentoの2に新製品を保存してから、私はそれを更新し、両方created_atupdated_at値は私のローカルタイムゾーンで表現されています。Magento 1では、これらの日付はUTCで保存されました。これは「動作しないもの」ではなく「動作が異なるもの」なので、magento / magento2 GitHubリポジトリで問題を開く必要がありますか、それとも別の方法がありますか?敬具アレッサンドロ
アレッサンドロロンキ2016年

@AlessandroRonchiがgithubで問題を開くのは正しい方法であり、SOの質問と提案へのリンクも示しています:)
Ivan Chepurnyi


これに関するニュースは?
Wouter 2017

0
 use Magento\Framework\Stdlib\DateTime\TimezoneInterface;

 class Retry extends \Magento\Framework\App\Action\Action
 {
         protected $yourDate;
         public function __construct(
            Context $context,
            TimezoneInterface $yourDate
         ) {
            parent::__construct($context);
            $this->yourDate =  $yourDate;
         }

         public function execute()
         {
          $currentDate = $this->yourDate->date()->format('Y-m-d H:i:s');
         }
 }

-1

以下の解決策は、Magento 2.1.2 CE&Worksで問題なく動作したことです。

ファイル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();

これは間違っています。MagentoはUTCで動作するはずです(各ストアビューは異なるタイムゾーンを持つことができるため)。
Wouter 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.