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_at
EAVエンティティの属性は、GMT 0タイムゾーンに従って保存されているようです。updated_at
ローカルタイムゾーンに応じて。
さらに、Created
バックエンドモデルには2つのアプローチがあり、そのうちの1つはコメントされています。
最善のアプローチのための私の研究はあなたの助けを必要とします。ありがとうございました