Я пишу генератор php sitemap для моего сайта, где я публикую статьи. Я хотел бы использовать метку времени из базы данных MySQL, чтобы поместить ее в тег lastmod файла sitemap.xml. Это код:
<?php
//request to database:
$sql = 'SELECT `id`, `date_update` FROM `table`';
$pdoobj_query = $db->query($sql);
$array_db = $pdoobj_query->fetchAll(PDO::FETCH_ASSOC);
date_default_timezone_set('Europe/Moscow');
//generating text of the sitemap.xml
$file = "sitemap.xml";
$sitemap_text = <<<MAP
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"MAP;
$number_of_array_elements = count($array_db);
$i=0;
while ($i < $number_of_array_elements){
$sitemap_text .= "\t" . '<url>' . "\r\n";
$sitemap_text .= "\t" . "\t" . '<loc>http://example.com/index.php?page=' . $array_db[$i]['id'] . '</loc>' . "\r\n";
$sitemap_text .= "\t" . "\t" . '<lastmod>' . date('c', strtotime($array_db[$i]['date_update'])) . '</lastmod>' . "\r\n";
$sitemap_text .= "\t" . "\t" . '<changefreq>weekly</changefreq>' . "\r\n";
$sitemap_text .= "\t" . "\t" . '<priority>0.9</priority>' . "\r\n";
$sitemap_text .= "\t" . '</url>' . "\r\n";
$i++;
}
$sitemap_text .='</urlset>';
file_put_contents($file, $sitemap_text);
?>
Я получил следующее значение для тега lastmod:
...
<lastmod>2016-02-06T01:53:44+04:00</lastmod>
...
UTC +04: 00, предоставленный PHP для «Европа / Москва», в настоящее время неверен, так как российское законодательство изменилось. Это должно быть UTC +03: 00. Посмотрите здесь для исторических изменений DST: Часовой пояс в Москве, Россия
Я пытался использовать следующий совет:
$original = new DateTime("now");
$timezoneName = timezone_name_from_abbr("", 3*3600, false);
$modified = $original->setTimezone(new DateTimezone($timezoneName));
echo $modified->format('c');
Но php забирает часовой пояс «Европа / Москва» и возвращает 2016-02-09T04: 41: 53 + 04: 00, что на один час опережает текущее время.
Есть ли способ заставить php отформатировать метку времени, извлеченную из таблицы MySQL с UTC +03: 00 time zome?
Задача ещё не решена.
Других решений пока нет …