Rss Feed显示1970-01-01 pubDate?

时间:2012-10-09 09:28:22

标签: php rss

我的RSS在我的移动网站上显示1970-01-01 pubDate,并在网站上显示正确的pubDate。饲料是否有腐蚀性?它在3天前工作了。

或者我可能以非标准的方式编写格式?

    function get_rss($url, $lang) {
    $rss = new rss_php;
    $rss->load($url);
    $items = $rss->getItems();

    // Sets the maximum items to be listed
    $max_items = 5;

    $count = 0;

    $html = '';
    foreach($items as $index => $item) {
    $pubdate = date("Y-m-d", strtotime(substr($item['pubDate'], 4)));
    $html .= '
    <ul class="rssList">
    <li class="itemDate"><span>' . $pubdate . '</span></li>
    <li class="itemTitle"><a href="'.$item['link'].'"                 title="'.$item['title'].'"                         rel="external">        
 <h2>'.$item['title'].'</h2></a></li>
    <li class="itemText"><span>'.$item['description'].'<span></li>
    </ul>';
    $count++; //Increase the value of the count by 1
    if($count==$max_items) break; //Break the loop is count is equal to the max_loop
    }    
     echo $html;
    }

rss_php的定义

        class rss_php {

    public $document;
    public $channel;
    public $items;

    # load RSS by URL
        public function load($url=false, $unblock=true) {
            if($url) {
                if($unblock) {
                    $this->loadParser(file_get_contents($url, false, $this->randomContext()));
                } else {
                    $this->loadParser(file_get_contents($url));
                }
            }
        }
    # load raw RSS data
        public function loadRSS($rawxml=false) {
            if($rawxml) {
                $this->loadParser($rawxml);
            }
        }

分析器

   private function loadParser($rss=false) {
    if($rss) {
        $this->document = array();
        $this->channel = array();
        $this->items = array();
        $DOMDocument = new DOMDocument;
        $DOMDocument->strictErrorChecking = false;
        $DOMDocument->loadXML($rss);
        $this->document = $this->extractDOM($DOMDocument->childNodes);
    }
}

2 个答案:

答案 0 :(得分:3)

出于某种原因,对于for循环中的项目,$item['pubDate']未定义(或者包含垃圾),date默认为1970-01-01。确保您的变量始终设置并包含有效format中的日期。

调试您的循环,并为每个item打印其内容:var_dump($item['pubDate'])以进一步调查

答案 1 :(得分:1)

问题可能在于区域设置。它无法翻译月份“okt”(英语应该是“oct”),但是用“sep”工作正常(英语相同)。 strtotime()功能仅适用于英语,但解释了为什么它在几天前工作,但现在没有。

您有三种选择:

  1. 您可以使用setlocale()修正使用strtotime生成日期的方式。您需要在RSS类中使用它,将语言环境设置为英语并输出日期。

  2. 在阅读字符串时使用CreateFromFormat(),在阅读日期时与SetLocale一起使用。你应该可以翻译一个外国日期。

  3. 自己手动解析日期。 Preg_match()可能是一个很好的起点。

  4. 如果可以的话,选项1可能是最简单的。


    编辑(基于评论和编辑过的问题)

    由于项目数据直接来自rss feed(并且不是自生成的),因此您可能需要选择3(手动解析字符串)。由于你忽略了一周的日子,你需要转换的唯一一点是月份,所以使用str_replace:

    foreach($items as $index => $item) {
        $pubdateForeignString = substr($item['pubDate'], 4);
        $pubdateEnglishString = str_replace(array('mai', 'okt', 'dez'), array('may', 'oct', 'dec'), $pubdateForeignString);
        $pubdate = date("Y-m-d", strtotime($pubdateEnglishString));
    

    你只需要转换不同的月份 - 我已经尝试了德语,但如果有疑问,你可以在setlocale()的循环中使用日期('M')。