Magento 2 - Best Practice, um das aktuelle Datum zu erhalten

8

Ich muss ein updated_atAttribut 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\UpdatedAttribut-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 DateTimeKonstruktors 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/RomeZeitzone 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\Createdund 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_atAttribut für EAV-Entitäten scheint gemäß der GMT 0-Zeitzone gespeichert zu sein. Die updated_atnach lokaler Zeitzone.

Darüber hinaus gibt es im CreatedBackend-Modell zwei Ansätze , von denen einer kommentiert ist.

Meine Forschung für den besten Ansatz braucht Ihre Hilfe. Vielen Dank

Alessandro Ronchi
quelle
Ich kann nicht glauben, dass Ihr Github-Problem nie beantwortet wurde :-(
Peedee

Antworten:

3

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.

Ivan Chepurnyi
quelle
Ich habe ein Experiment durchgeführt: Ich habe ein neues Produkt auf Magento 2 gespeichert und es dann aktualisiert. Beide created_atund updated_atWerte 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 Alessandro
Alessandro Ronchi
@AlessandroRonchi Öffnen einer Ausgabe auf Github ist ein richtiger Weg, auch einen Link zu SO Frage und Vorschlag zeigen :)
Ivan Chepurnyi
erledigt: github.com/magento/magento2/issues/4452
Alessandro Ronchi
Gibt es Neuigkeiten zu diesem Thema?
Wouter
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');
         }
 }
AlexanderPop
quelle
-1

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.

date_default_timezone_set('UTC');

Was falsch ist, stellen Sie auf Ihre ein

date_default_timezone_set('Asia/Singapore');

& Aktuelles Datum abrufen mit

$magentoDateObject = $objectManager->create('Magento\Framework\Stdlib\DateTime\DateTime');
echo $magentoDate = $magentoDateObject->gmtDate();
Ankit Shah
quelle
Das ist falsch. Magento soll in UTC funktionieren (da jede Geschäftsansicht eine andere Zeitzone haben kann).
Wouter