Ich muss ein updated_at
Attribut einer benutzerdefinierten Entität speichern und wissen, welche die beste Vorgehensweise ist. Ich habe mir angesehen, wie Magento 2 damit umgeht.
Ich habe mir die \Magento\Eav\Model\Entity\Attribute\Backend\Time\Updated
Attribut-Backend-Modellklasse angesehen und hier ist der Code:
public function beforeSave($object)
{
$object->setData(
$this->getAttribute()->getAttributeCode(),
(new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT)
);
return $this;
}
Mein erster Zweifel ist: Welche Zeitzone wird berücksichtigt?
Die Signatur des DateTime
Konstruktors lautet:
public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
Laut Konstruktordokumentation :
Wenn $ timezone weggelassen wird, wird die aktuelle Zeitzone verwendet.
Ich nehme an, dass die aktuelle Zeitzone die auf Serverebene konfigurierte ist.
Um dies zu beweisen, führen Sie einfach das folgende PHP-Snippet aus:
<?php
var_dump(new DateTime());
Das erwartete Ergebnis ist:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2016-05-10 12:47:11.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(11) "Europe/Rome"
}
Die Europe/Rome
Zeitzone ist die lokal auf meinem Server konfigurierte.
Aber Magento 1 wurde verwendet, um Datum und Uhrzeit gemäß GMT 0 zu speichern, um die Bestätigung zu erhalten, dass sich dieser Ansatz mit Magento 2 geändert hat. Ich habe das geöffnet \Magento\Eav\Model\Entity\Attribute\Backend\Time\Created
und hier kommt die Überraschung:
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;
}
Das created_at
Attribut für EAV-Entitäten scheint gemäß der GMT 0-Zeitzone gespeichert zu sein. Die updated_at
nach lokaler Zeitzone.
Darüber hinaus gibt es im Created
Backend-Modell zwei Ansätze , von denen einer kommentiert ist.
Meine Forschung für den besten Ansatz braucht Ihre Hilfe. Vielen Dank
quelle
Antworten:
Das ist sehr einfach, da das \ DateTime-Objekt immer eine Zeitzone enthält. Es ist jederzeit möglich, es in UTC zu übersetzen, aber die Magento 2.0-Codebasis funktioniert leider nicht. Sehen Sie sich diese Kernmethode in der Datenbankverbindung an, die eine Transformation durchführt: https://github.com/magento/magento2/blob/6ea7d2d85cded3fa0fbcf4e7aa0dcd4edbf568a6/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mq Wie Sie sehen, wird intern \ Magento \ Framework \ Stdlib \ DateTime aufgerufen, um die Zeit in eine Textdarstellung umzuwandeln. Es gibt leider keine Zeitzonenkonvertierung.
Ich würde Ihnen empfehlen, einen Fehlerbericht zu veröffentlichen, damit das Problem behoben wird, da das Datum immer in UTC beibehalten werden muss, da für jede Geschäftsansicht eine eigene Zeitzone konfiguriert werden kann.
Wie bei jedem anderen modernen PHP-ORM sollten Sie im Idealfall nur das \ DateTime-Objekt angeben können und der Rest, wie es gespeichert wird, von der Bibliothek selbst verarbeitet werden. Als Entwickler von Geschäftslogik sollten Sie sich keine Gedanken über die Zeitzonenkonvertierungen machen.
Meiner Meinung nach sollte \ Magento \ Faramework alle \ DateTime-Objekte in einer Nicht-UTC-Zeitzone in eine UTC-Zeitzone konvertieren, wenn Daten in einer Datenbank gespeichert werden, und im Frontend einfach die Zeitzone für die aktuell konfigurierte ändern, anstatt dort Inkonsistenzen zu haben. Außerdem sollte jede Filterung datetime-Objekte stattdessen für die Datenbankfiltration in UTC konvertieren.
quelle
created_at
undupdated_at
Werte werden in meiner lokalen Zeitzone angegeben. In Magento 1 wurden diese Daten in UTC gespeichert. Da dies nicht "etwas ist, das nicht funktioniert", sondern "etwas, das anders funktionieren sollte", muss ich ein Problem mit magento / magento2 GitHub Repo eröffnen oder gibt es einen anderen Weg? Mit freundlichen Grüßen Alessandroquelle
Die folgende Lösung ist, dass ich in Magento 2.1.2 CE & Works gut versucht habe.
Gehen Sie zur Datei
app\bootstrap.php
, hier finden Sie das Ende der Datei.Was falsch ist, stellen Sie auf Ihre ein
& Aktuelles Datum abrufen mit
quelle