Преглед изворни кода

[ZF-7731] Zend_Date:

- changed extended timestamp behaviour on negative timezones

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17935 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas пре 16 година
родитељ
комит
f375c38b64
2 измењених фајлова са 12 додато и 10 уклоњено
  1. 9 7
      library/Zend/Date/DateObject.php
  2. 3 3
      tests/Zend/Date/DateObjectTest.php

+ 9 - 7
library/Zend/Date/DateObject.php

@@ -300,6 +300,7 @@ abstract class Zend_Date_DateObject {
         if ($this->_timezone != $oldzone) {
         if ($this->_timezone != $oldzone) {
             date_default_timezone_set($this->_timezone);
             date_default_timezone_set($this->_timezone);
         }
         }
+
         if ($timestamp === null) {
         if ($timestamp === null) {
             $result = ($gmt) ? @gmdate($format) : @date($format);
             $result = ($gmt) ? @gmdate($format) : @date($format);
             date_default_timezone_set($oldzone);
             date_default_timezone_set($oldzone);
@@ -312,7 +313,8 @@ abstract class Zend_Date_DateObject {
             return $result;
             return $result;
         }
         }
 
 
-        $jump = false;
+        $jump      = false;
+        $origstamp = $timestamp;
         if (isset(self::$_cache)) {
         if (isset(self::$_cache)) {
             $idstamp = strtr('Zend_DateObject_date_' . $this->_offset . '_'. $timestamp . '_'.(int)$gmt, '-','_');
             $idstamp = strtr('Zend_DateObject_date_' . $this->_offset . '_'. $timestamp . '_'.(int)$gmt, '-','_');
             if ($result2 = self::$_cache->load($idstamp)) {
             if ($result2 = self::$_cache->load($idstamp)) {
@@ -328,11 +330,13 @@ abstract class Zend_Date_DateObject {
                 while (abs($tempstamp) > 0x7FFFFFFF) {
                 while (abs($tempstamp) > 0x7FFFFFFF) {
                     $tempstamp -= (86400 * 23376);
                     $tempstamp -= (86400 * 23376);
                 }
                 }
+
                 $dst = date("I", $tempstamp);
                 $dst = date("I", $tempstamp);
                 if ($dst === 1) {
                 if ($dst === 1) {
                     $timestamp += 3600;
                     $timestamp += 3600;
                 }
                 }
-                $temp = date('Z', $tempstamp);
+
+                $temp       = date('Z', $tempstamp);
                 $timestamp += $temp;
                 $timestamp += $temp;
             }
             }
 
 
@@ -345,16 +349,14 @@ abstract class Zend_Date_DateObject {
         if (($timestamp < 0) and ($gmt !== true)) {
         if (($timestamp < 0) and ($gmt !== true)) {
             $timestamp -= $this->_offset;
             $timestamp -= $this->_offset;
         }
         }
-        date_default_timezone_set($oldzone);
 
 
-        $date = $this->getDateParts($timestamp, true);
+        date_default_timezone_set($oldzone);
+        $date   = $this->getDateParts($timestamp, true);
         $length = strlen($format);
         $length = strlen($format);
         $output = '';
         $output = '';
 
 
         for ($i = 0; $i < $length; $i++) {
         for ($i = 0; $i < $length; $i++) {
-
             switch($format[$i]) {
             switch($format[$i]) {
-
                 // day formats
                 // day formats
                 case 'd':  // day of month, 2 digits, with leading zero, 01 - 31
                 case 'd':  // day of month, 2 digits, with leading zero, 01 - 31
                     $output .= (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']);
                     $output .= (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']);
@@ -586,7 +588,7 @@ abstract class Zend_Date_DateObject {
                     break;
                     break;
 
 
                 case 'U':  // Unix timestamp
                 case 'U':  // Unix timestamp
-                    $output .= $timestamp;
+                    $output .= $origstamp;
                     break;
                     break;
 
 
 
 

+ 3 - 3
tests/Zend/Date/DateObjectTest.php

@@ -398,8 +398,8 @@ class Zend_Date_DateObjectTest extends PHPUnit_Framework_TestCase
         $this->assertSame(           '0', $date->date('U',0          ));
         $this->assertSame(           '0', $date->date('U',0          ));
         $this->assertSame(           '0', $date->date('U',0,false    ));
         $this->assertSame(           '0', $date->date('U',0,false    ));
         $this->assertSame(           '0', $date->date('U',0,true     ));
         $this->assertSame(           '0', $date->date('U',0,true     ));
-        $this->assertSame(  '6900007200', $date->date('U',6900000000 ));
-        $this->assertSame( '-6999996400', $date->date('U',-7000000000));
+        $this->assertSame(  '6900000000', $date->date('U',6900000000 ));
+        $this->assertSame( '-7000000000', $date->date('U',-7000000000));
         $this->assertSame(          '06', $date->date('d',-7000000000));
         $this->assertSame(          '06', $date->date('d',-7000000000));
         $this->assertSame(         'Wed', $date->date('D',-7000000000));
         $this->assertSame(         'Wed', $date->date('D',-7000000000));
         $this->assertSame(           '6', $date->date('j',-7000000000));
         $this->assertSame(           '6', $date->date('j',-7000000000));
@@ -436,7 +436,7 @@ class Zend_Date_DateObjectTest extends PHPUnit_Framework_TestCase
         $this->assertSame(        '3600', $date->date('Z',-7000000000));
         $this->assertSame(        '3600', $date->date('Z',-7000000000));
         $this->assertSame(       '1748-03-06T12:33:20+0100', $date->date('c',-7000000000));
         $this->assertSame(       '1748-03-06T12:33:20+0100', $date->date('c',-7000000000));
         $this->assertSame('Wed, 06 Mar 1748 12:33:20 +0100', $date->date('r',-7000000000));
         $this->assertSame('Wed, 06 Mar 1748 12:33:20 +0100', $date->date('r',-7000000000));
-        $this->assertSame( '-6999996400', $date->date('U'    ,-7000000000 ));
+        $this->assertSame( '-7000000000', $date->date('U'    ,-7000000000 ));
         $this->assertSame(           'H', $date->date('\\H'  ,-7000000000 ));
         $this->assertSame(           'H', $date->date('\\H'  ,-7000000000 ));
         $this->assertSame(           '.', $date->date('.'    ,-7000000000 ));
         $this->assertSame(           '.', $date->date('.'    ,-7000000000 ));
         $this->assertSame(    '12:33:20', $date->date('H:i:s',-7000000000 ));
         $this->assertSame(    '12:33:20', $date->date('H:i:s',-7000000000 ));