我真的不知道这里发生了什么。我正在尝试将RSS源添加到我的博客中。由于RSS要求日期为RFC822格式,我使用PHP日期函数来转换我的原始时间戳(0000-00-00 00:00:00)。问题是,Feed中所有帖子的显示日期和时间是1970年1月1日01:33。这是代码:
<?php
while ($row = $query->fetch_assoc()) {
?>
<item>
<title><?php echo $row['title']; ?></title>
<description>Item description</description>
<link>http://mysite.com/blog.php<?php echo '?id='.$row['id']; ?></link>
<pubDate><?php echo date('r', $row['date_posted']); ?></pubDate>
</item>
编辑:这是我的查询。我在这里转换为Unix时间戳吗?
$query = $db->query("
SELECT `posts`.`id`,
`posts`.`cat_id`,
`posts`.`title`,
`posts`.`contents`,
`posts`.`date_posted`
FROM `posts`
ORDER BY `posts`.`date_posted`
DESC
LIMIT 10");
EDIT2:感谢所有的帮助,但它仍然无效。不可否认,我并没有完全理解这一点,但我确信这是一个简单的解决方案。整个feed.php文件实际上并不长,所以这里是所有的代码,以防我错过了一些重要的细节。哦,日期正确存储在数据库的date_posted列中。
<?php
$db = new mysqli('host', 'user', 'pass', 'db');
$query = $db->query("
SELECT `posts`.`id`,
`posts`.`cat_id`,
`posts`.`title`,
`posts`.`contents`,
`posts`.`date_posted`
FROM `posts`
ORDER BY `posts`.`date_posted`
DESC
LIMIT 10");
if ($db->affected_rows >= 1) {
echo '<?xml version="1.0" encoding="iso-8859-1" ?>' ?>
<rss version="2.0">
<channel>
<title>Title</title>
<description>RSS feed</description>
<link>http://mysite.com</link>
<?php
while ($row = $query->fetch_assoc()) {
?>
<item>
<title><?php echo $row['title']; ?></title>
<description><?php echo substr($row['contents'], 0, 150) ?></description>
<link>http://mysite.com/blog.php<?php echo '?id='.$row['id']; ?></link>
<pubDate><?php echo date('r', $row['date_posted']); ?></pubDate>
</item>
<?php
}
?>
</channel>
</rss>
<?php
}
?>
答案 0 :(得分:2)
$row['date_posted']
的原始价值是多少?请记住,date()
需要PHP时间戳,这是一个简单的unix时间戳 - 整数表示自1970年1月1日以来的秒数。如果你给它一个字符串(例如2012-12-11 08:55:00
),你只会得到一个错位值,因为PHP试图将该字符串转换为int:
$now = '2012-12-11 08:56:00';
echo date('r', $now); // Wed, 31 Dec 1969 18:33:32 -0600
echo date('r', (int)$now); // Wed, 31 Dec 1969 18:33:32 -0600
echo (int)$now; // 2012
echo date('r', 2012); // Wed, 31 Dec 1969 18:33:32 -0600
您必须将日期字段转换为MySQL中的unix时间戳,或使用MySQL的own date formatting函数:
SELECT UNIX_TIMESTAMP(date_posted), ...
or
SELECT DATE_FORMAT(date_posted, 'format string here'), ...
答案 1 :(得分:0)
那是因为php的日期对象是UNIX Timestamp。它始于1970年1月1日。您需要检查超出该范围的日期,例如0000-00-00并手动处理。
另外,检查数据库并确保正确存储时间戳。如果你期待一个真正的约会并且正在获得0000-00-00,那么你可能直接插入PHP时间戳,MySQL无法识别该格式。您必须以这种格式将时间戳插入字符串:Y-m-d H:i:s
例如:INSERT INTO table (time) VALUES ('2012-01-01 13:30:00') WHERE id=1
。您可以使用php的date('Y-m-d H:i:s')
来获取此格式。
如果您希望某些日期为0,而其他日期为实际日期,则可以在此处插入内联,如果要将0000日期替换为您想要的任何日期,同时根据需要转换日期。
<?php
while ($row = $query->fetch_assoc()) {
?>
<item>
<title><?php echo $row['title']; ?></title>
<description>Item description</description>
<link>http://mysite.com/blog.php<?php echo '?id='.$row['id']; ?></link>
<pubDate><?php echo strncmp($row['date_posted'], '0000-00-00', 10) == 0 ? 'NOT PUBLISHED' : date('r', $row['date_posted']); ?></pubDate>
</item>