PHP — настроить час, извлеченный из RSS-канала для перехода на летнее время

У меня есть PHP-скрипт, который извлекает из RSS-канала и создает серию выходных данных на основе событий. Сценарий работал нормально до прошлой недели, когда изменилось летнее время.

Скрипт работает с RSS-каналом, дата которого имеет следующую структуру:

pubDate: Чт, 04 апреля 2013 г., 19:05:00 GMT

Мне нужно было создавать разные php-скрипты для каждого дня и времени, поэтому я использовал следующее:

$expiry = $item->pubDate;
$expiryLenght = strlen("$expiry");
$timeStart = $expiryLenght - 12;
$time = substr("$expiry","$timeStart", 5);
$hour = substr("$time",0, 2);
$day_alpha = substr("$expiry",0, 3);
$day = substr("$expiry",5, 2);
$month = substr("$expiry",8, 3);
$year = substr("$expiry", 12, 4);
$month = strtolower($month);
$month_num = monthNum($month);

Для меня важной частью является строка «$hour». Мне нужно попытаться настроить это на летнее время. pubDate всегда указывается по Гринвичу без поправок.

Я думал о том, чтобы пойти по пути определения периода перехода на летнее время, и если он находится в пределах временных рамок, добавить 1 к часу. Однако я не уверен, что это хорошее решение.

Любая помощь будет принята с благодарностью, Дэйв.


После большой помощи от комментариев я закончил тем, что использовал это

$expiry1 = $item->pubDate;

$expiry = date('D, d M Y H:i:s \off', strtotime($expiry1 . "Европа/Дублин"));

Немного хакерской работы, но она вернула Expiry в прежний формат, а это означало, что остальная часть кода могла работать с ним.


person Dave Walker    schedule 04.04.2013    source источник
comment
Вы должны построить объект даты из этих значений и работать с ним.   -  person deed02392    schedule 04.04.2013
comment
@deed02392 Согласен. Посмотрите этот пост для вдохновения philsturgeon.co.uk/blog/ 2012/08/почему-php-datetime-роки   -  person danneth    schedule 04.04.2013
comment
Одного часа недостаточно, чтобы продолжать. Вы будете отсутствовать на день в первый час каждого нового дня и на месяц первого числа каждого месяца летнего времени.   -  person bcmcfc    schedule 04.04.2013


Ответы (2)


Я сейчас на работе, поэтому не могу проверить это, но я считаю, что вы хотите сделать что-то в этом роде:

<?php
$timestring = 'Thu, 04 Apr 2013 19:05:00 GMT';
$mytimezone = new DateTimeZone('Pacific/Nauru');
$datetime = date_create_from_format('D, d M Y h:i:s T', $timestring, $mytimezone);

echo $datetime->format('Y-m-d H:i:sP');

Это создает объект DateTime из строки, отформатированной, как вы указали, но с выбранным вами часовым поясом. Итак, вы выбираете часовой пояс, он анализирует дату/время из вашего RSS-канала и преобразует его в часовой пояс по вашему выбору.

Это также намного меньше кода, чем то, что вы сейчас делаете. :-)

person deed02392    schedule 04.04.2013
comment
Большое спасибо за это. Мои навыки PHP не очень хороши, поэтому я не смог заставить работать остальную часть скрипта после этого, хотя это работало отлично. Действительно ценю это! - person Dave Walker; 04.04.2013
comment
Чтобы заставить его работать с остальной частью вашего скрипта, вам, вероятно, просто нужно заменить ссылки на такие вещи, как $hour на $datetime->format('H'), используя соответствующий из этого причудливого списка параметров: php.net/manual/en/function.date.php - person deed02392; 04.04.2013

person    schedule
comment
Большое спасибо за это. Действительно очень полезно! Очень ценю! - person Dave Walker; 04.04.2013