1

私のRSSフィードは私のモバイルサイトで1970-01-01pubDateを表示し、Webサイトで正しい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()関数は英語でのみ機能しますが、数日前は機能していたのに現在は機能していない理由を説明しています。

次の 3 つのオプションがあります。

  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 に答える