Magento 2 - Thực hành tốt nhất để có được ngày hiện tại


8

Tôi phải lưu một updated_atthuộc tính của một thực thể tùy chỉnh và để biết đó là cách thực hành tốt nhất tôi đã xem qua cách Magento 2 xử lý nó.

Tôi đã xem \Magento\Eav\Model\Entity\Attribute\Backend\Time\Updatedlớp mô hình phụ trợ thuộc tính và đây là đoạn mã:

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

Nghi ngờ đầu tiên của tôi là: múi giờ nào được xem xét?

Chữ ký của nhà DateTimexây dựng là:

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

Theo tài liệu xây dựng :

Nếu $ múi giờ bị bỏ qua, múi giờ hiện tại sẽ được sử dụng.

Tôi cho rằng múi giờ hiện tạimúi giờ được cấu hình ở cấp máy chủ.

Để chứng minh điều đó, chỉ cần thực thi đoạn mã PHP sau:

<?php
var_dump(new DateTime());

Kết quả dự kiến ​​là:

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

Các Europe/Romemúi giờ là một trong những địa phương cấu hình trên máy chủ của tôi.

Nhưng Magento 1 đã được sử dụng để tiết kiệm ngày và thời gian theo GMT 0 vì vậy để có xác nhận rằng phương pháp này đã thay đổi với Magento 2 tôi đã mở \Magento\Eav\Model\Entity\Attribute\Backend\Time\Createdvà đây là điều bất ngờ:

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;
}

Các created_atthuộc tính cho thực thể EAV dường như được lưu theo giờ GMT 0 múi giờ. Các updated_attheo múi giờ địa phương.

Hơn nữa có hai cách tiếp cận trong Createdmô hình phụ trợ, một trong số đó được nhận xét.

Nghiên cứu của tôi cho cách tiếp cận tốt nhất cần sự giúp đỡ của bạn. Cảm ơn bạn


không thể tin được vấn đề github của bạn không bao giờ nhận được bất kỳ câu trả lời nào :-(
peedee

Câu trả lời:


3

Điều đó rất đơn giản, vì đối tượng \ DateTime luôn chứa múi giờ, nên có thể dịch nó sang UTC bất cứ lúc nào, nhưng thật không may, cơ sở mã Magento 2.0 không làm được. Hãy xem phương thức cốt lõi này trong kết nối cơ sở dữ liệu thực hiện chuyển đổi: https://github.com/magento/magento2/blob/6ea7d2d85cded3fa0fbcf4e7aa0dcd4edbf568a6/lib/i INTERNal / Mac / Như bạn thấy, nó gọi nội bộ \ Magento \ Framework \ Stdlib \ DateTime để chuyển đổi thời gian thành biểu diễn văn bản. Thật không may là không có sự hội tụ múi giờ được thực hiện.

Tôi khuyên bạn nên đăng báo cáo lỗi, để họ khắc phục sự cố đó, vì nó phải luôn luôn cập nhật trong UTC, vì mọi chế độ xem cửa hàng có thể có cấu hình múi giờ riêng.

Lý tưởng nhất, như với bất kỳ ORM PHP hiện đại nào khác, bạn chỉ có thể chỉ định đối tượng \ DateTime và phần còn lại cách lưu trữ sẽ được xử lý bởi chính thư viện, bạn là nhà phát triển logic nghiệp vụ không nên lo lắng về chuyển đổi múi giờ.

Theo tôi, \ Magento \ Fariêu nên chuyển đổi tất cả các đối tượng \ DateTime trong múi giờ không UTC thành múi giờ UTC khi lưu trữ dữ liệu trong cơ sở dữ liệu và trên frontend chỉ thay đổi múi giờ cho cấu hình hiện tại, thay vì có sự không nhất quán ở đó. Ngoài ra, tất cả các bộ lọc nên chuyển đổi các đối tượng datetime thành UTC thay vì lọc cơ sở dữ liệu.


Tôi đã thực hiện một thử nghiệm: Tôi đã lưu một sản phẩm mới trên Magento 2 và sau đó tôi đã cập nhật nó và cả hai created_atupdated_atcác giá trị được thể hiện trong múi giờ địa phương của tôi. Trong Magento 1 những ngày đó đã được lưu trong UTC. Vì đây không phải là "thứ gì đó không hoạt động" mà là "thứ gì đó nên hoạt động khác", tôi có phải mở một vấn đề trên repo magento / magento2 GitHub hay có một cách khác? Trân trọng Alessandro
Alessandro Ronchi

@AlessandroRonchi mở một vấn đề trên github là một cách đúng đắn, cũng như chỉ ra một liên kết đến câu hỏi và đề xuất SO :)
Ivan Chepurnyi


Bất kỳ tin tức về điều này?
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');
         }
 }

-1

Giải pháp dưới đây là tôi đã thử trong Magento 2.1.2 CE & Hoạt động tốt.

Đi đến tập tin app\bootstrap.php, ở đây cuối tập tin bạn sẽ tìm thấy.

date_default_timezone_set('UTC');

Cái nào sai, đặt cho cái của bạn

date_default_timezone_set('Asia/Singapore');

& Nhận ngày hiện tại bằng cách sử dụng

$magentoDateObject = $objectManager->create('Magento\Framework\Stdlib\DateTime\DateTime');
echo $magentoDate = $magentoDateObject->gmtDate();

Cái này sai. Magento được cho là hoạt động trong UTC (vì mỗi lượt xem cửa hàng có thể có múi giờ khác nhau).
Wouter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.