我的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);
}
}
答案 0 :(得分:3)
出于某种原因,对于for
循环中的项目,$item['pubDate']
未定义(或者包含垃圾),date
默认为1970-01-01。确保您的变量始终设置并包含有效format中的日期。
调试您的循环,并为每个item
打印其内容:var_dump($item['pubDate'])
以进一步调查
答案 1 :(得分:1)
问题可能在于区域设置。它无法翻译月份“okt”(英语应该是“oct”),但是用“sep”工作正常(英语相同)。 strtotime()
功能仅适用于英语,但解释了为什么它在几天前工作,但现在没有。
您有三种选择:
您可以使用setlocale()
修正使用strtotime生成日期的方式。您需要在RSS类中使用它,将语言环境设置为英语并输出日期。
在阅读字符串时使用CreateFromFormat()
,在阅读日期时与SetLocale
一起使用。你应该可以翻译一个外国日期。
自己手动解析日期。 Preg_match()
可能是一个很好的起点。
如果可以的话,选项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')。