1

我的 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);
    }
}
4

2 回答 2

3

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

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

于 2012-10-09T09:32:17.387 回答
1

问题可能与语言环境设置有关。它无法翻译月份“okt”(应该是英语中的“oct”),但可以正常使用“sep”(英语相同)。该strtotime()功能仅适用于英语,但解释了为什么它在几天前可以工作,但现在不行。

你有三个选择:

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

  2. CreateFromFormat()在读取字符串时使用,与SetLocale读取日期时结合使用。您应该能够翻译外国日期。

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

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


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

由于项目数据直接来自 rss 提要(并且不是自行生成的),因此您可能会选择选项 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() 的循环中使用 date('M')。

于 2012-10-09T09:54:08.810 回答