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

Fixed errors in parsing non-standard RSS dates under US Locale. Fixes ZF-8702

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22086 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic пре 15 година
родитељ
комит
d14df52640

+ 21 - 16
library/Zend/Feed/Reader/Entry/Rss.php

@@ -265,22 +265,27 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         ) {
             $dateModified = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/pubDate)');
             if ($dateModified) {
-                $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822,
-                Zend_Date::RFC_2822, Zend_Date::DATES);
-                $date = new Zend_Date;
-                foreach ($dateStandards as $standard) {
-                    try {
-                        $date->set($dateModified, $standard);
-                        break;
-                    } catch (Zend_Date_Exception $e) {
-                        if ($standard == Zend_Date::DATES) {
-                            require_once 'Zend/Feed/Exception.php';
-                            throw new Zend_Feed_Exception(
-                                'Could not load date due to unrecognised'
-                                .' format (should follow RFC 822 or 2822):'
-                                . $e->getMessage(),
-                                0, $e
-                            );
+                $dateModifiedParsed = strtotime($dateModified);
+                if ($dateModifiedParsed) {
+                    $date = new Zend_Date($dateModifiedParsed);
+                } else {
+                    $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822,
+                    Zend_Date::RFC_2822, Zend_Date::DATES);
+                    $date = new Zend_Date;
+                    foreach ($dateStandards as $standard) {
+                        try {
+                            $date->set($dateModified, $standard);
+                            break;
+                        } catch (Zend_Date_Exception $e) {
+                            if ($standard == Zend_Date::DATES) {
+                                require_once 'Zend/Feed/Exception.php';
+                                throw new Zend_Feed_Exception(
+                                    'Could not load date due to unrecognised'
+                                    .' format (should follow RFC 822 or 2822):'
+                                    . $e->getMessage(),
+                                    0, $e
+                                );
+                            }
                         }
                     }
                 }

+ 21 - 16
library/Zend/Feed/Reader/Feed/Rss.php

@@ -226,22 +226,27 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract
                 $dateModified = $this->_xpath->evaluate('string(/rss/channel/lastBuildDate)');
             }
             if ($dateModified) {
-                $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822,
-                Zend_Date::RFC_2822, Zend_Date::DATES);
-                $date = new Zend_Date;
-                foreach ($dateStandards as $standard) {
-                    try {
-                        $date->set($dateModified, $standard);
-                        break;
-                    } catch (Zend_Date_Exception $e) {
-                        if ($standard == Zend_Date::DATES) {
-                            require_once 'Zend/Feed/Exception.php';
-                            throw new Zend_Feed_Exception(
-                                'Could not load date due to unrecognised'
-                                .' format (should follow RFC 822 or 2822):'
-                                . $e->getMessage(),
-                                0, $e
-                            );
+                $dateModifiedParsed = strtotime($dateModified);
+                if ($dateModifiedParsed) {
+                    $date = new Zend_Date($dateModifiedParsed);
+                } else {
+                    $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822,
+                    Zend_Date::RFC_2822, Zend_Date::DATES);
+                    $date = new Zend_Date;
+                    foreach ($dateStandards as $standard) {
+                        try {
+                            $date->set($dateModified, $standard);
+                            break;
+                        } catch (Zend_Date_Exception $e) {
+                            if ($standard == Zend_Date::DATES) {
+                                require_once 'Zend/Feed/Exception.php';
+                                throw new Zend_Feed_Exception(
+                                    'Could not load date due to unrecognised'
+                                    .' format (should follow RFC 822 or 2822):'
+                                    . $e->getMessage(),
+                                    0, $e
+                                );
+                            }
                         }
                     }
                 }

+ 18 - 0
tests/Zend/Feed/Reader/Entry/RssTest.php

@@ -1896,6 +1896,24 @@ class Zend_Feed_Reader_Entry_RssTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($edate->equals($entry->getDateModified()));
     }
 
+    /**
+     * @group ZF-8702
+     */
+    public function testParsesCorrectDateIfMissingOffsetWhenSystemUsesUSLocale()
+    {
+        $locale = new Zend_Locale('en_US');
+        Zend_Registry::set('Zend_Locale', $locale);
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20_en_US.xml')
+        );
+        $entry = $feed->current();
+        $fdate = $entry->getDateModified();
+        $edate = new Zend_Date;
+        $edate->set('2010-01-04T08:14:00-0600', Zend_Date::ISO_8601);
+        Zend_Registry::getInstance()->offsetUnset('Zend_Locale');
+        $this->assertTrue($edate->equals($fdate));
+    }
+
     // DC 1.0
 
     public function testGetsDateModifiedFromRss20_Dc10()

+ 8 - 0
tests/Zend/Feed/Reader/Entry/_files/Rss/datemodified/plain/rss20_en_US.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="2.0">
+    <channel>
+        <item>
+            <pubDate>Mon, 4 Jan 2010 02:14:00 CST</pubDate>
+        </item>
+    </channel>
+</rss>

+ 17 - 0
tests/Zend/Feed/Reader/Feed/RssTest.php

@@ -2103,6 +2103,23 @@ class Zend_Feed_Reader_Feed_RssTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($edate->equals($feed->getDateModified()));
     }
 
+    /**
+     * @group ZF-8702
+     */
+    public function testParsesCorrectDateIfMissingOffsetWhenSystemUsesUSLocale()
+    {
+        $locale = new Zend_Locale('en_US');
+        Zend_Registry::set('Zend_Locale', $locale);
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/datemodified/plain/rss20_en_US.xml')
+        );
+        $fdate = $feed->getDateModified();
+        $edate = new Zend_Date;
+        $edate->set('2010-01-04T08:14:00-0600', Zend_Date::ISO_8601);
+        Zend_Registry::getInstance()->offsetUnset('Zend_Locale');
+        $this->assertTrue($edate->equals($fdate));
+    }
+
     // DC 1.0
 
     public function testGetsDateModifiedFromRss20_Dc10()

+ 6 - 0
tests/Zend/Feed/Reader/Feed/_files/Rss/datemodified/plain/rss20_en_US.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="2.0">
+    <channel>
+        <lastBuildDate>Mon, 4 Jan 2010 02:14:00 CST</lastBuildDate>
+    </channel>
+</rss>