Magento 2 Nhận ngày cửa hàng hiện tại Thời gian


25

Trong Magento 1.x bạn có thể nhận được thời gian ngày cửa hàng thông qua

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

Điều gì sẽ tương đương với điều này trong Magento 2.x?

Câu trả lời:


43

Bạn cần tiêm vào hàm tạo của lớp của bạn một thể hiện \Magento\Framework\Stdlib\DateTime\DateTimevà sử dụng cái đó.
Một cái gì đó như thế này:

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

Sau đó, bạn có thể sử dụng trong lớp của bạn này:

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

1
nó cung cấp cho ngày gmt làm thế nào để có được ngày giờ của cửa hàng hiện tại
ND17

Tôi đã thử cách này nhưng nó luôn cho thời gian chênh lệch là 5 giờ, bạn có thể giúp tôi không
Naveenbos

Làm thế nào để chỉ có thời gian?
Sanjay Gohil

2
@SanjayGohil. phương pháp gmtDatehiển thị ở trên chấp nhận 2 tham số tùy chọn. Đầu tiên là $formatmặc định Y-m-d H:i:s. Bạn chỉ có thể gọi phương thức với tham số bạn muốn gmtDate('H:i:s')hoặc bất kỳ định dạng thời gian nào khác.
Marius

Làm thế nào để thêm / trừ tháng vào / từ ngày bằng phương pháp này?
Ajwad Syed

18

Để có được ngày UTC trong Magento2, bạn nên sử dụng\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

Bạn nên tiêm phụ thuộc vào lớp này thông qua cấu trúc và sau đó sử dụng hàm này. Xem lớp này để biết thêm các phương pháp liên quan đến ngày / giờ.

Trong mẫu mã của bạn, bạn đang truy xuất ngày UTC, không phải ngày lưu trữ. Để có được định dạng ngày theo múi giờ của cửa hàng hiện tại , hãy sử dụng Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();(một lần nữa, bằng cách thêm phụ thuộc vào cấu trúc)


Đối với múi giờ cửa hàng hiện tại, chức năng này chỉ cung cấp cho tôi ngày không phải thời gian vì vậy làm thế nào tôi có thể có thời gian?
ND17

Hãy xem\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Alex Paliarush

12

Bạn có thể dễ dàng lấy Thời gian ngày lưu trữ hiện tại bằng cách thêm vào trình xây dựng lớp của mình \Magento\Framework\Stdlib\DateTime\TimezoneInterfacevà sử dụng cái đó để lấy DateObject.

Ví dụ:

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

Và sau đó bạn có thể sử dụng nó như sau:

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

Để biết thêm thông tin về các định dạng khác nhau, bạn có thể xem bài viết này tôi đã viết https://codeblog.experius.nl/magento-2-get-civerse-store-date-time/


1
Nếu tôi muốn lấy timeZone thì sao?
Nhà phát triển Webile

người ta có thể lấy múi giờ bằng mã này $ this-> storeManager-> getStore () -> getConfig ('general / locale / timezone'). và lớp phụ thuộc cho điều này sẽ là \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager,
Rajeev Singh

3

Chúng tôi có thể đặt múi giờ lưu trữ bằng cách sử dụng trình quan sát với sự kiện "control_action_predispatch"

Tạo sự kiện trong thư mục Mymodle / etc / frontend / event.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>

Trong thư mục Observer tạo tệp 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();
    }
}

Bây giờ thay vì nhận ngày "UTC", chúng tôi nhận được ngày lưu trữ hiện tại bằng cách sử dụng chức năng ngày đơn giản ("Ymd H: i: s").


2

Magento 2.x có các đối tượng ngữ cảnh cho các lớp khác nhau, nếu bạn ở trong ngữ cảnh của Khối thì đối tượng ngữ cảnh có thể cung cấp cho bạn đối tượng ngày địa phương như sau:

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

sau đó bạn có thể sử dụng nó như sau:

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

Điều này sẽ tránh lỗi trong khi thực hiện lệnh di: compile.


2

Để có được thời gian ngày hiện tại của một cửa hàng cụ thể (trừ cửa hàng hiện tại trong StoreManager):

Tham khảo từ \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 sẽ giúp bạn có thời gian ngày UTC, giờ GMT hoặc giờ ngày của cửa hàng hiện tại.

Magento 2 bộ UTC trong app/bootstrap:

date_default_timezone_set('UTC');

\DateTimesử dụng cài đặt múi giờ PHP này theo mặc định. Magento 2 sẽ sử dụng UTC nội bộ và nó cũng lưu trong MySQL trong UTC. Máy chủ Linux và máy chủ MySQL thường được đặt thành múi giờ UTC. Chuỗi các cài đặt múi giờ trên máy chủ không thuộc phạm vi của chủ đề này.

Magento 2 sẽ hiển thị vào ngày trước trong múi giờ của cửa hàng hiện tại bằng cách sử dụng trình phân giải ngôn ngữ \Magento\Framework\Locale\Resolverđể lấy múi giờ của cửa hàng hiện tại (ví dụ Europe/Bruxelles).


0

Trong trường hợp của tôi, nếu tôi sử dụng điều này trên bộ điều khiển của mình, nó không hoạt động. Tôi nhận được ngày địa phương mặc định thay thế.

Nhưng nếu tôi sử dụng nó trên khối của tôi, nó hoạt động.

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

-6

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();

Tại sao lại date_default_timezone_set('UTC')sai? Về mặt kiến ​​trúc, sẽ hợp lý khi đặt TZ mặc định của bạn thành UTC, sau đó chuyển đổi giữa các cửa hàng theo ý muốn. Điều tương tự cũng áp dụng cho ngày & giờ trong DB: dễ dàng hơn nếu bạn lưu trữ chúng trong UTC và chuyển đổi theo nhu cầu.
nevvermind

1
Đây là lời khuyên tồi. Magento cố ý lưu trữ giá trị ngày / giờ trong cơ sở dữ liệu dưới dạng UTC và chuyển đổi chúng thành múi giờ địa phương của cửa hàng để hiển thị cho người dùng.
Darren Felton
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.