Yanıtlar:
Sınıf yapıcınıza bir örnek enjekte etmeniz \Magento\Framework\Stdlib\DateTime\DateTime
ve bunu kullanmanız gerekir.
Bunun gibi bir şey:
protected $date;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\DateTime $date,
....
) {
....
$this->date = $date;
....
}
Sonra sınıfınızda bunu kullanabilirsiniz:
$date = $this->date->gmtDate();
gmtDate
Yukarıda gösterilen yöntem 2 isteğe bağlı parametre kabul eder. İlki, $format
varsayılan olandır Y-m-d H:i:s
. Sadece istediğiniz parametreyi gmtDate('H:i:s')
veya başka bir zaman biçimini kullanarak yöntemi arayabilirsiniz .
Magento2'de UTC tarihi almak için kullanmanız gerekir\Magento\Framework\Stdlib\DateTime\DateTime::gmtDate();
Bu sınıfa bağımlılık yoluyla yapıyı enjekte etmeli ve sonra bu işlevi kullanmalısınız. Daha fazla tarih / saat ile ilgili yöntemler için bu sınıfa bakın.
Kod numaranızda UTC tarihini alıyorsunuz, depo tarihini değil. Geçerli mağazanın saat dilimine göre biçimlendirilmiş tarih almak için , kullanın
Magento\Framework\Stdlib\DateTime\TimezoneInterface::formatDate();
(yine, yapıya bağımlılığı enjekte ederek)
\Magento\Framework\Stdlib\DateTime\DateTime::gmtTimestamp()
Geçerli Mağaza Tarih Saatini, sınıf \Magento\Framework\Stdlib\DateTime\TimezoneInterface
yapıcınıza örneğin enjekte ederek kolayca alabilir ve DateObject'i almak için bunu kullanabilirsiniz.
Örneğin:
protected $timezone;
public function __construct(
....
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
....
) {
....
$this->timezone = $timezone;
....
}
Ve sonra, aşağıdaki gibi kullanabilirsiniz:
$date = $this->timezone->formatDate();
Farklı biçimler hakkında daha fazla bilgi için https://codeblog.experius.nl/magento-2-get-current-store-date-time/ yazdığım bu makaleye göz atabilirsiniz
"Controller_action_predispatch" olayı olan gözlemci kullanarak mağaza saat dilimini ayarlayabiliriz
Mymodle / etc / frontend / events.xml klasöründe events.xml dosyasını oluşturun
<?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>
Gözlemci klasöründe SetStoreTimezoneObserver.php dosyası oluşturun
<?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();
}
}
Şimdi “UTC” tarihi almak yerine, basit tarih ("Ymd H: i: s") işlevini kullanarak güncel mağaza tarihini alıyoruz.
Magento 2.x, farklı sınıflar için bağlam nesnelerine sahiptir, eğer bir Blok bağlamındaysanız, bağlam nesnesi size yerel tarih nesnesini aşağıdaki gibi verebilir:
/**
* 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
);
}
o zaman aşağıdaki gibi kullanabilirsiniz:
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');
Bu di: compile komutunu çalıştırırken hataları önleyecektir.
Belirli bir mağazanın güncel tarih saatini almak için (StoreManager'daki mevcut mağazanın dışında):
Dan referans \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 tarih saatini, GMT tarih saatini veya mevcut mağazanın tarih saatini alır.
Magento 2 UTC'yi şu şekilde ayarlar app/bootstrap
:
date_default_timezone_set('UTC');
\DateTime
bu PHP zaman dilimi ayarını varsayılan olarak kullanır. Magento 2 dahili UTC'yi kullanacak ve aynı zamanda UTC'deki MySQL'de de tasarruf sağlayacak Linux sunucuları ve MySQL sunucuları genellikle UTC saat dilimine ayarlanır. Bir sunucudaki saat dilimi ayarlarının zinciri bu konu kapsamında değildir.
Magento 2 \Magento\Framework\Locale\Resolver
, geçerli mağazanın saat dilimini (örn. Europe/Bruxelles
) Almak için yerel çözümleyiciyi kullanarak geçerli mağazanın saat dilimindeki tarihi gösterir .
Benim durumumda, eğer bunu kontrol cihazımda kullanırsam, işe yaramaz. Bunun yerine varsayılan yerel tarihi alıyorum.
Ama blokumda kullanırsam çalışır.
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
$todayDate = $this->_timezone->date()->format('Y-m-d H:i:s');