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); 
    }
}    
Kristof Ringleff

Kristof Ringleff

Founder and Lead Developer at Fooman

Want to receive our monthly email with the best Magento developer tips, tricks and news? Join 7000+ other Magento developers