|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2013-06-27 21:18 UTC] mike at silverorange dot com
 Description:
------------
If a DateTime subclass implements Serializable it cant be unserialized. A PHP 
warning is raised when restoring the time zone is attempted.
Test script:
---------------
class MyDate extends DateTime implements Serializable
{
    public function serialize()
    {
        $data = array(
            $this->getTimestamp(),
            $this->dateTimezone()->getName()
        );
        return serialize($data);
    }
    public function unserialize($data)
    {
        $data = unserialize($data);
        $this->setTimestamp($data[0]);
        $this->setTimezone(new DateTimeZone($data[1]));
    }
}
$d = new MyDate('2013-01-01', new DateTimeZone('UTC'));
echo unserialize(serialize($d))->format('c');
Expected result:
----------------
2013-01-01T00:00:00+00:00
Actual result:
--------------
Warning: DateTime::setTimezone(): The DateTime object has not been correctly 
initialized by its constructor
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Thu Oct 30 22:00:01 2025 UTC | 
This is not a bug. An unserialize implementation is responsible for properly constructing the entire object and that includes calling its parent's constructor if that would normally be necessary. You would have the same problem if you overrode DateTime's constructor and did not call parent::__construct. It's fairly easy to address in code though. Just call the parent's constructor in unserialize, e.g. public function unserialize($data) { parent::__construct(null); $data = unserialize($data); $this->setTimestamp($data[0]); $this->setTimezone(new DateTimeZone($data[1])); }