Каков правильный формат публикации 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));
Вот как я решил скомпилировать допустимую дату и время 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]')"/>