Magento 2 Dapatkan Waktu Tanggal Toko Saat Ini

25

Di Magento 1.x Anda bisa mendapatkan waktu tanggal toko via

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

Apa yang akan setara dengan ini di Magento 2.x?

Eirik
sumber

Jawaban:

42

Anda perlu menyuntikkan konstruktor kelas Anda contoh \Magento\Framework\Stdlib\DateTime\DateTimedan menggunakannya.
Sesuatu seperti ini:

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

Kemudian, Anda dapat menggunakan di kelas Anda ini:

$date = $this->date->gmtDate();
Marius
sumber
1
itu memberikan tanggal gmt cara mendapatkan tanggal bijaksana zona waktu toko saat ini
ND17
Saya sudah mencoba ini tetapi selalu memberikan perbedaan waktu 5 jam, bisakah Anda membantu saya
Naveenbos
Bagaimana cara mendapatkan waktu saja?
Sanjay Gohil
2
@SanjayGohil. metode yang gmtDateditunjukkan di atas menerima 2 parameter opsional. Yang pertama adalah $formatdefault Y-m-d H:i:s. Anda bisa memanggil metode dengan parameter yang Anda inginkan gmtDate('H:i:s')atau format waktu lainnya.
Marius
Bagaimana cara menambah / mengurangi bulan ke / dari tanggal dengan metode ini?
Ajwad Syed
18

Untuk mendapatkan tanggal UTC di Magento2, Anda harus menggunakan\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

Anda harus menyuntikkan ketergantungan pada kelas ini melalui konstruk dan kemudian menggunakan fungsi ini. Lihat kelas ini untuk metode terkait tanggal / waktu lainnya.

Dalam contoh kode Anda, Anda mengambil tanggal UTC, bukan tanggal toko. Untuk mendapatkan tanggal yang diformat sesuai dengan zona waktu toko saat ini , gunakan Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(lagi, dengan menyuntikkan ketergantungan untuk membangun)

Alex Paliarush
sumber
Untuk zona waktu toko saat ini fungsi ini hanya memberi saya tanggal bukan waktu jadi bagaimana saya bisa mendapatkan waktu juga?
ND17
Lihatlah\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush
12

Anda dapat dengan mudah mendapatkan Waktu Tanggal Toko Saat Ini dengan menyuntikkan konstruktor kelas Anda secara instan \Magento\Framework\Stdlib\DateTime\TimezoneInterfacedan menggunakannya untuk mendapatkan DateObject.

Sebagai contoh:

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

Dan kemudian Anda dapat menggunakannya sebagai berikut:

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

Untuk informasi lebih lanjut tentang berbagai format Anda dapat melihat artikel ini saya menulis https://codeblog.experius.nl/magento-2-get-current-store-date-time/

Tuan Lewis
sumber
1
Bagaimana jika saya ingin mendapatkan zona waktu ??
Pengembang Webile
seseorang bisa mendapatkan zona waktu menggunakan kode ini $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). dan kelas dependensi untuk ini adalah \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh
3

Kita dapat mengatur zona waktu toko menggunakan pengamat dengan event "controller_action_predispatch"

Buat events.xml di folder 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>

Di folder Observer buat file 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();
    }
}

Sekarang alih-alih mendapatkan tanggal "UTC", kami mendapatkan tanggal toko saat ini menggunakan fungsi tanggal sederhana ("Ymd H: i: s").

Sachin
sumber
2

Magento 2.x memiliki objek konteks untuk kelas yang berbeda, jika Anda berada dalam konteks Blok maka objek konteks dapat memberi Anda objek tanggal lokal sebagai berikut:

/**
 * 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
    );
}

maka Anda dapat menggunakannya seperti berikut:

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

Ini akan menghindari kesalahan saat menjalankan perintah di: compile.

mshakeel
sumber
2

Untuk mendapatkan waktu tanggal saat ini dari toko tertentu (selain toko saat ini di StoreManager):

Referensi dari \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 akan memberi Anda waktu tanggal UTC, waktu tanggal GMT atau waktu tanggal toko saat ini.

Magento 2 menyetel UTC ke dalam app/bootstrap:

date_default_timezone_set('UTC');

\DateTimemenggunakan pengaturan zona waktu PHP ini secara default. Magento 2 akan menggunakan UTC internal dan menyimpan di MySQL dalam UTC juga. Server Linux dan server MySQL biasanya diatur ke zona waktu UTC. Rantai pengaturan zona waktu pada server tidak dalam cakupan topik ini.

Magento 2 akan ditampilkan di frontend tanggal di zona waktu toko saat ini menggunakan penyelesai lokal \Magento\Framework\Locale\Resolveruntuk mendapatkan zona waktu toko saat ini (misalnya Europe/Bruxelles).

mengaburkan
sumber
0

Dalam kasus saya, jika saya menggunakan ini pada controller saya, itu tidak berfungsi. Saya mendapatkan tanggal lokal default sebagai gantinya.

Tetapi jika saya menggunakannya di blok saya itu berfungsi.

\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Diego Sanabria
sumber