Triggered by a recent discussion on Slack and noticing this latest Pull Request to fix some timezone handling specific code in the Magento 2 framework (Github PR) it seems to confirm a long held suspicion that something in the Magento framework timezone handling was not quite working the way I believe it should (even going back to M1 days). Below is an approach similar to what I have been using to translate for example the order date to the timezone of the store. It would be able to handle any Magento model that descends from \Magento\Framework\DataObject
and has getCreatedAt()
and getStoreId()
methods.
class CreationTimeAtTimezone
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
private $scopeConfig;
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
) {
$this->scopeConfig = $scopeConfig;
}
public function getCreatedAtStore(\Magento\Framework\DataObject $object, $format = 'Y-m-d')
{
$datetime = \DateTime::createFromFormat('Y-m-d H:i:s', $object->getCreatedAt());
$timezone = $this->scopeConfig->getValue(
'general/locale/timezone',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$object->getStoreId()
);
if ($timezone) {
$storeTime = new \DateTimeZone($timezone);
$datetime->setTimezone($storeTime);
}
return $datetime->format($format);
}
}