Browse Source

Store timezone as DateTimeZone instance instead of string.

ADmad 8 years ago
parent
commit
1d8ade07ff

+ 8 - 5
src/Database/Type/DateTimeType.php

@@ -92,9 +92,9 @@ class DateTimeType extends Type implements TypeInterface
     protected $_className;
 
     /**
-     * Timezone string.
+     * Timezone instance.
      *
-     * @var string|null
+     * @var \DateTimeZone|null
      */
     protected $dbTimezone;
 
@@ -128,9 +128,9 @@ class DateTimeType extends Type implements TypeInterface
         $format = (array)$this->_format;
 
         if ($this->dbTimezone !== null
-            && $this->dbTimezone !== $value->getTimezone()->getName()
+            && $this->dbTimezone->getName() !== $value->getTimezone()->getName()
         ) {
-            $value = $value->setTimezone(new DateTimeZone($this->dbTimezone));
+            $value = $value->setTimezone($this->dbTimezone);
         }
 
         return $value->format(array_shift($format));
@@ -143,11 +143,14 @@ class DateTimeType extends Type implements TypeInterface
      * datetime string for saving to database. If `null` no timezone conversion
      * will be done.
      *
-     * @param string|null $timezone Database timezone.
+     * @param string|\DateTimeZone|null $timezone Database timezone.
      * @return $this
      */
     public function setTimezone($timezone)
     {
+        if (is_string($timezone)) {
+            $timezone = new DateTimeZone($timezone);
+        }
         $this->dbTimezone = $timezone;
 
         return $this;

+ 5 - 0
tests/TestCase/Database/Type/DateTimeTypeTest.php

@@ -18,6 +18,7 @@ use Cake\Database\Type\DateTimeType;
 use Cake\I18n\FrozenTime;
 use Cake\I18n\Time;
 use Cake\TestSuite\TestCase;
+use DateTimeZone;
 
 /**
  * Test for the DateTime type.
@@ -127,6 +128,10 @@ class DateTimeTypeTest extends TestCase
         $this->type->setTimezone('Asia/Kolkata'); // UTC+5:30
         $result = $this->type->toDatabase($date, $this->driver);
         $this->assertEquals('2013-08-12 20:46:17', $result);
+
+        $this->type->setTimezone(new DateTimeZone('Asia/Kolkata'));
+        $result = $this->type->toDatabase($date, $this->driver);
+        $this->assertEquals('2013-08-12 20:46:17', $result);
         $this->type->setTimezone(null);
 
         $date = new FrozenTime('2013-08-12 15:16:17');