Каков правильный формат публикации RSS-ленты?

У меня проблемы с получением даты моего RSS-канала для правильной работы. Вы знаете, какая точная дата, чтобы показать это?

Я храню его в поле creation_date в следующем формате: 2012-08-14 10:17:12

Тогда я беру это:

$pubDate = $article[creation_date];

Затем я конвертирую это:

$pubDate= date("Y-m-d", strtotime($pubDate));

Затем в теге item я помещаю его:

<pubdate>'.date("l, F d, Y", strtotime($pubDate)).'</pubdate>

Есть ли что-то, чего я не вижу?

10 ответов

Решение

Решено:

$pubDate = $article[creation_date]; 
    $pubDate= date("D, d M Y H:i:s T", strtotime($pubDate));

тогда в моем эхо-коде:

 <pubDate>'.$pubDate.'</pubDate>

Функция даты в PHP уже имеет способ форматирования дат, соответствующих pubDate (RFC 2822):

date('r', $timestamp);

Увидеть pubDate определение в RSS 2.0 Спецификация:

Все даты и время в RSS соответствуют спецификации даты и времени RFC 822, за исключением того, что год может быть выражен двумя символами или четырьмя символами (предпочтительно четыре).

Вот примеры действительных дат-периодов RFC822:

<pubDate>Wed, 02 Oct 2002 08:00:00 EST</pubDate>

<pubDate>Wed, 02 Oct 2002 13:00:00 GMT</pubDate>

<pubDate>Wed, 02 Oct 2002 15:00:00 +0200</pubDate>

См. Также проблемное значение даты и времени RFC 822.

Используйте этот формат: D, d M Y H:i:s O, Смотрите http://php.net/manual/en/class.datetime.php

Или используйте константы DateTime для более простого использования: DateTime::RSS

Rss pubDate использует стандарты RFC 2822. Вы можете достичь этого в php вызывая r аргумент функции Date, т.е.

<?php
$pubDate= date('r', time());
echo "<pubDate>$pubDate</pubDate>";
# <pubDate>Thu, 20 Nov 2014 18:59:18 UTC</pubDate>
?>

Если вы предпочитаете класс DateTime, используйте:

$pubDate = new DateTime();
echo $pubDate->format(DateTime::RSS);

Как насчет DateTime объект (PHP 5> = 5.2.0)

\DateTime::createFromFormat(\DateTime::RSS, $RSSDate); // converting RSS date to object

или же

date(\DateTime::RSS, $timestamp); // formatting timestamp to RSS time

или оба

$dto = \DateTime::createFromFormat(\DateTime::RSS, $RSSDate);
date('d-M-Y H:i:s', $dto->getTimestamp()); // formatting RSS date to anything you want

или даже лучше

$dto = \DateTime::createFromFormat(\DateTime::RSS, $RSSDate);
$formattedDate = $dto->format('d-M-Y H:i:s');

Пока принят ответ ("D, d M Y H:i:s T") в большинстве случаев работает как положено, это не на 100% правильно. В многоязычных ситуациях эта строка может давать не английский текст, который не будет принят как RFC-совместимый. Чтобы всегда быть уверенным, что используется английская версия, используйте "r",

Самый простой способ - использовать предопределенную константу DATE_RSS (доступно с PHP 5.1.0).

$pubDate = date(DATE_RSS, strtotime($pubDate));

Я использовал так:

$item->date = date('D, d M Y H:i:s GMT', strtotime($myBlogPublishedTime));

мой образец hp rss

Вот как я решил скомпилировать допустимую дату и время RFC-822 для RSS в XSLT:

      <xsl:variable name="now" select="fn:current-dateTime()"/>
<xsl:value-of select="format-dateTime($now, '[FNn,3-3], [D01] [MNn,3-3] [Y0001] [H01]:[m01]:[s01] [Z0001]')"/>
Другие вопросы по тегам