Magento 2 รับวันที่ร้านค้าปัจจุบันเวลา


25

ใน Magento 1.x คุณจะได้รับวันเวลาเก็บผ่าน

Mage::getModel('core/date')->gmtDate();

อะไรจะเทียบเท่ากับใน Magento 2.x

คำตอบ:


42

คุณต้องใช้อินสแตนซ์ของคลาส constructor ของคุณ\Magento\Framework\Stdlib\DateTime\DateTimeแล้วใช้มัน
บางสิ่งเช่นนี้

protected $date;
public function __construct(
    ....
    \Magento\Framework\Stdlib\DateTime\DateTime $date,
    ....
) {
    ....
    $this->date = $date;
    ....
}

จากนั้นคุณสามารถใช้ในชั้นเรียนของคุณนี้:

$date = $this->date->gmtDate();

1
จะให้วันที่ gmt วิธีรับวันที่เวลาในการจัดเก็บในปัจจุบัน
ND17

ฉันได้ลองแล้ว แต่มันให้เวลา 5 ชั่วโมงคุณสามารถช่วยฉันได้
เสมอ

ทำอย่างไรถึงจะได้เวลาเท่านั้น
Sanjay Gohil

2
@SanjayGohil วิธีที่gmtDateแสดงด้านบนยอมรับ 2 พารามิเตอร์ตัวเลือก คนแรกเป็นที่เริ่มต้นที่$format Y-m-d H:i:sคุณสามารถเรียกเมธอดด้วยพารามิเตอร์ที่คุณต้องการgmtDate('H:i:s')หรือรูปแบบเวลาอื่น
Marius

วิธีการเพิ่ม / ลบเดือนเข้า / จากวันที่ด้วยวิธีนี้?
Ajwad Syed

18

ในการรับวันที่ UTCใน Magento2 คุณควรใช้\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

คุณควรฉีดพึ่งพาระดับนี้ผ่านการสร้างแล้วใช้ฟังก์ชั่นนี้ ดูคลาสนี้สำหรับวิธีการเพิ่มเติมเกี่ยวกับวันที่ / เวลา

ในตัวอย่างโค้ดของคุณคุณกำลังดึงข้อมูลวันที่ UTC ไม่ใช่วันที่จัดเก็บ ในการรับวันที่จัดรูปแบบตามเขตเวลาของร้านค้าปัจจุบันให้ใช้ Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(อีกครั้งโดยการฉีดพึ่งพาเพื่อสร้าง)


สำหรับเขตเวลาปัจจุบันของร้านค้าฟังก์ชั่นนี้ให้วันที่ฉันไม่ใช่เวลาเท่านั้นฉันจะได้เวลาด้วยได้อย่างไร
ND17

ดู\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush

12

คุณสามารถได้รับวันเวลาเก็บปัจจุบันโดยการฉีดในตัวสร้างคลาสของคุณด้วยอินสแตนซ์\Magento\Framework\Stdlib\DateTime\TimezoneInterfaceและใช้อันนั้นเพื่อรับ DateObject

ตัวอย่างเช่น:

protected $timezone;
public function __construct(
    ....
    \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
    ....
) {
    ....
    $this->timezone = $timezone;
    ....
}

จากนั้นคุณสามารถใช้งานได้ดังต่อไปนี้:

$date = $this->timezone->formatDate();

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบที่แตกต่างกันคุณสามารถดูที่บทความนี้ฉันเขียนhttps://codeblog.experius.nl/magento-2-get-current-store-date-time/


1
จะทำอย่างไรถ้าฉันต้องการรับโซนเวลา
นักพัฒนา Webile

หนึ่งสามารถรับเขตเวลาโดยใช้รหัสนี้ $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone') และระดับการพึ่งพาสำหรับสิ่งนี้คือ \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh

3

เราสามารถตั้งค่าเขตเวลาการจัดเก็บโดยใช้ผู้สังเกตการณ์พร้อมเหตุการณ์ "controller_action_predispatch"

สร้าง events.xml ในโฟลเดอร์ Mymodle / etc / frontend / events.xml

<?xml version="1.0" encoding="UTF-8"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="controller_action_predispatch">
        <observer name="mymodule_timezone_set" instance="MyNamespace\Mymodule\Observer\SetStoreTimezoneObserver" />
    </event> </config>

ในโฟลเดอร์ Observer ให้สร้างไฟล์ SetStoreTimezoneObserver.php

<?php
namespace MyNamespace\Mymodule\Observer;

use Magento\Framework\Event\ObserverInterface;

class SetStoreTimezoneObserver implements ObserverInterface
{

    protected $_storeTime;
    protected $_storeManager;

    public function __construct(
        \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
        \Magento\Store\Model\StoreManagerInterface $storeManager
    )
    {
        $this->_storeTime = $timezone;
        $this->_storeManager = $storeManager;
        $this->setStoreTimezone();
    }

    /**
     * Retrieve store model instance
     *
     * @return \Magento\Store\Model\Store
     */
    public function getStore()
    {
        return $this->_storeManager->getStore();
    }

    /*
     * Set Store Timezone
     */
    public function setStoreTimezone()
    {
        date_default_timezone_set(
            $this->_storeTime->getConfigTimezone('store', $this->getStore())
        );
    }

    /**
     * Predispath admin action controller
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return void
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $this->setStoreTimezone();
    }
}

ตอนนี้แทนที่จะได้รับวันที่ "UTC" เราได้รับวันที่เก็บปัจจุบันโดยใช้ฟังก์ชันแบบง่าย ("Ymd H: i: s")


2

Magento 2.x มีวัตถุบริบทสำหรับชั้นเรียนที่แตกต่างกันถ้าคุณอยู่ในบริบทของบล็อกแล้ววัตถุบริบทสามารถให้คุณวันที่วัตถุสถานที่ดังต่อไปนี้:

/**
 * Locale Date/Timezone
 * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface
 */
protected $_timezone;

/**
 * @param \Magento\Catalog\Block\Product\Context $context
 * @param array $data
 */
public function __construct(
    \Magento\Catalog\Block\Product\Context $context,
    array $data = []
) {
    $this->_timezone = $context->getLocaleDate();
    parent::__construct(
        $context,
        $data
    );
}

จากนั้นคุณสามารถใช้งานได้ดังต่อไปนี้:

$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');

สิ่งนี้จะหลีกเลี่ยงข้อผิดพลาดขณะดำเนินการคำสั่ง di: compile


2

วิธีรับวันที่ปัจจุบันของร้านค้าเฉพาะ (นอกเหนือจากร้านค้าปัจจุบันใน StoreManager):

อ้างอิงจาก \Magento\Framework\Stdlib\DateTime\Timezone::convertConfigTimeToUtc()

/** @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone */
/** @var \Magento\Framework\Stdlib\DateTime\Timezone $timezone */

$timezone = $this->timezone->getConfigTimezone(\Magento\Store\Model\ScopeInterface::SCOPE_STORES, $storeId);
$currentDate = new \DateTime('now', new \DateTimeZone($timezone));
var_dump($currentDate->format('Y-m-d H:i:s'));

\Magento\Framework\Stdlib\DateTime คุณจะได้รับเวลา UTC วันที่เวลา GMT หรือวันที่เก็บปัจจุบันของ

Magento 2 ตั้ง UTC ในapp/bootstrap:

date_default_timezone_set('UTC');

\DateTimeใช้การตั้งค่าเขตเวลา PHP ตามค่าเริ่มต้น Magento 2 จะใช้ภายใน UTC และจะบันทึกใน MySQL ใน UTC ด้วย เซิร์ฟเวอร์ Linux และเซิร์ฟเวอร์ MySQL มักตั้งค่าเป็นเขตเวลา UTC สายโซ่ของการตั้งค่าเขตเวลาบนเซิร์ฟเวอร์ไม่ได้อยู่ในขอบเขตของหัวข้อนี้

Magento 2 จะแสดงหน้าวันที่ในเขตเวลาปัจจุบันของร้านค้าโดยใช้ตัวแก้ไขสถานที่\Magento\Framework\Locale\Resolverเพื่อรับเขตเวลาปัจจุบันของร้านค้า (เช่นEurope/Bruxelles)


0

ในกรณีของฉันถ้าฉันใช้สิ่งนี้กับตัวควบคุมมันไม่ทำงาน ฉันได้รับวันที่ภาษาเริ่มต้นแทน

แต่ถ้าฉันใช้มันในบล็อกของฉันมันใช้งานได้

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.