【问题标题】:Conversion to RFC822 date format转换为 RFC822 日期格式
【发布时间】:2012-11-29 03:03:24
【问题描述】:

我真的不知道这里发生了什么。我正在尝试向我的博客添加 RSS 提要。由于 RSS 要求日期为 RFC822 格式,因此我使用 PHP 日期函数来转换我的原始时间戳 (0000-00-00 00:00:00)。问题是我在提要中的所有帖子显示的日期和时间是 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
}
?>

【问题讨论】:

  • 基本调试:var_dump($row['date_posted']);

标签: php mysql rss timestamp rfc822


【解决方案1】:

这是因为 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>

【讨论】:

  • 感谢您的努力,但我复制了您提供的代码 sn-p,但它仍然显示错误的日期。我还检查了日期是否正确存储在数据库本身中,它们是。我在上面包含了 feed.php 的所有代码,以防您在那里发现其他错误。再次感谢!
【解决方案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'), ...

【讨论】:

  • $row['date_posted'] 从中获取行的列是mysql中的数据类型时间戳。它的默认模式设置为 0000-00-00 00:00:00。因此,具体帖子的格式为 2012-12-09 16:42:12 等。这对我来说是未知的领域。我是在我的 php 文档中还是在数据库本身中转换时间戳?
  • 我在上面包含了我的查询。非常感谢您解释我在哪里转换日期字段。
  • 如果您使用 unix_timestamp 选项,您的代码应该“正常工作”而无需更改。您将获得 PHP 可以接受的格式的时间戳。如果您使用 date_format 选项,那么您将在 PHP 中提取所有日期格式的内容,并简单地输出您从 mysql 获得的字符串。
  • 是的,但我实际上在哪里写“SELECT UNIX_TIMESTAMP...”?我是否将其包含在我的查询中?如果是这样,查询在哪里?谢谢!
  • 理论上你是对的,但我不明白如何实施你的解决方案。不过我找到了另一种方法:只需按以下方式使用 strtotime 函数: echo date('r', strtotime($row['date_posted']));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2016-12-02
  • 2023-03-30
  • 2011-08-13
  • 2010-12-06
相关资源
最近更新 更多