마 젠토 2 현재 매장 날짜 시간 가져 오기


25

Magento 1.x에서는 다음을 통해 상점 날짜 시간을 얻을 수 있습니다.

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

Magento 2.x에서 이것과 동등한 것은 무엇입니까?

답변:


42

클래스 생성자에 인스턴스를 주입하고 해당 인스턴스를 \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 시간의 시차를 제공 당신은 나를 도울 수 있습니다
Naveenbos

시간 만 얻는 방법?
Sanjay Gohil

2
@SanjayGohil. gmtDate위에 표시된 방법 은 2 개의 선택적 매개 변수를 허용합니다. 첫 번째는 $format기본값 Y-m-d H:i:s입니다. 원하는 매개 변수 gmtDate('H:i:s')또는 다른 시간 형식으로 메소드를 호출 할 수 있습니다 .
Marius

이 방법으로 날짜에 월을 추가하거나 빼는 방법은 무엇입니까?
Ajwad Syed

18

Magento2에서 UTC 날짜 를 얻으려면\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();

construct를 통해이 클래스에 대한 의존성을 주입 한 다음이 함수를 사용해야합니다. 자세한 날짜 / 시간 관련 방법은이 클래스를 참조하십시오.

코드 샘플에서 저장 날짜가 아닌 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
timeZone을 얻으려면 어떻게해야합니까 ??
개발자 Webile

이 코드 $ this-> storeManager-> getStore ()-> getConfig ( 'general / locale / timezone')을 사용하여 시간대를 얻을 수 있습니다. 이에 대한 종속성 클래스는 \ Magento \ Store \ Model \ StoreManagerInterface $ storeManager입니다.
Rajeev Singh

3

이벤트 "controller_action_predispatch"와 함께 옵저버를 사용하여 상점 시간대를 설정할 수 있습니다.

Mymodle / etc / frontend / events.xml 폴더에 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>

관찰자 폴더에서 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에는 다른 클래스에 대한 컨텍스트 객체가 있습니다. Block 컨텍스트에있는 경우 컨텍스트 객체는 다음과 같이 로캘 날짜 객체를 제공 할 수 있습니다.

/**
 * 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 날짜 시간 또는 현재 상점의 날짜 시간을 표시합니다.

마 젠토 2는 UTC를 app/bootstrap다음으로 설정합니다 .

date_default_timezone_set('UTC');

\DateTime기본적으로이 PHP 시간대 설정을 사용합니다. Magento 2는 내부 UTC를 사용하며 UTC로 MySQL에도 저장됩니다. 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.