답변:
클래스 생성자에 인스턴스를 주입하고 해당 인스턴스를 \Magento\Framework\Stdlib\DateTime\DateTime
사용해야합니다.
이 같은:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
그런 다음 수업에서 다음을 사용할 수 있습니다.
$date = $this->date->gmtDate();
gmtDate
위에 표시된 방법 은 2 개의 선택적 매개 변수를 허용합니다. 첫 번째는 $format
기본값 Y-m-d H:i:s
입니다. 원하는 매개 변수 gmtDate('H:i:s')
또는 다른 시간 형식으로 메소드를 호출 할 수 있습니다 .
Magento2에서 UTC 날짜 를 얻으려면\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
construct를 통해이 클래스에 대한 의존성을 주입 한 다음이 함수를 사용해야합니다. 자세한 날짜 / 시간 관련 방법은이 클래스를 참조하십시오.
코드 샘플에서 저장 날짜가 아닌 UTC 날짜를 검색합니다. 포맷 된 날짜에 따라 효율적으로 활용하려면 현재 상점의 시간대 , 사용
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(구조에 대한 의존성을 주입함으로써, 다시)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
인스턴스 생성자에 클래스 생성자를 삽입하여 현재 상점 날짜 시간을 쉽게 얻을 수 있으며 해당 생성자를 \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/에서 작성한이 기사를 살펴보십시오.
이벤트 "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") 함수를 사용하여 현재 상점 날짜를 가져옵니다.
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 명령을 실행하는 동안 오류가 발생하지 않습니다.
특정 상점의 현재 날짜 시간을 가져 오려면 (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
.
제 경우에는 이것을 컨트롤러에서 사용하면 작동하지 않습니다. 대신 기본 로캘 날짜가 표시됩니다.
그러나 내 블록에서 사용하면 작동합니다.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');