Конвертировать RSS pubDate в метку времени - PullRequest
12 голосов
/ 26 мая 2010

Как преобразовать строку даты Mon, 24 May 2010 17:54:00 GMT из RSS-канала в метку времени в PHP?

Ответы [ 5 ]

13 голосов
/ 20 апреля 2011

Попробуйте:

$pubDate = $item->pubDate;
$pubDate = strftime("%Y-%m-%d %H:%M:%S", strtotime($pubDate));
10 голосов
/ 26 мая 2010

Вы можете использовать встроенную функцию strtotime(). Он принимает строку даты в качестве первого аргумента и возвращает метку времени Unix.

http://php.net/manual/en/function.strtotime.php

7 голосов
/ 02 апреля 2012

strtotime не работает с разными часовыми поясами.

Я только что написал эту функцию для преобразования RSS pubDates в метки времени, которые учитывают различные часовые пояса:

function rsstotime($rss_time) {
    $day       = substr($rss_time, 5, 2);
    $month     = substr($rss_time, 8, 3);
    $month     = date('m', strtotime("$month 1 2011"));
    $year      = substr($rss_time, 12, 4);
    $hour      = substr($rss_time, 17, 2);
    $min       = substr($rss_time, 20, 2);
    $second    = substr($rss_time, 23, 2);
    $timezone  = substr($rss_time, 26);

    $timestamp = mktime($hour, $min, $second, $month, $day, $year);

    date_default_timezone_set('UTC');

    if(is_numeric($timezone)) {
        $hours_mod    = $mins_mod = 0;
        $modifier     = substr($timezone, 0, 1);
        $hours_mod    = (int) substr($timezone, 1, 2);
        $mins_mod     = (int) substr($timezone, 3, 2);
        $hour_label   = $hours_mod > 1 ? 'hours' : 'hour';
        $strtotimearg = $modifier . $hours_mod . ' ' . $hour_label;
        if($mins_mod) {
            $mins_label = $mins_mod > 1 ? 'minutes' : 'minute';
            $strtotimearg .= ' ' . $mins_mod . ' ' . $mins_label;
        }
        $timestamp = strtotime($strtotimearg, $timestamp);
    }

    return $timestamp;
}
0 голосов
/ 18 июня 2013
function pubdatetotime($pubDate) {

$months = array('Jan' => '01', 'Feb' => '02', 'Mar' => '03', 
'Apr' => '04', 'May' => '05', 'Jun' => '06', 
'Jul' => '07', 'Aug' => '08', 'Sep' => '09', 
'Oct' => '10', 'Nov' => '11', 'Dec' => '12');

$date = substr($pubDate, 5,11);
$year = substr($date, 7,4); 
$month = substr($date, 3,3);
$d =  substr($date, 0,2);

$time = substr($pubDate, 17,8);

return $year."-".$months[$month]."-".$d." ".$time;  
}

Попробуйте эту функцию

0 голосов
/ 22 мая 2013

Функция rsstotime () не работает должным образом, если переменная pubDate в RSS-канале имеет часовой пояс, отличный от + 0000 .Проблема была с модификатором $, его пришлось обратить вспять.Чтобы исправить это, нужно было добавить две строки, поэтому строка:

$modifier = substr($timezone, 0, 1); 

стала:

$modifier = substr($timezone, 0, 1);        
if($modifier == "+"){ $modifier = "-"; } else
if($modifier == "-"){ $modifier = "+"; }

Просто для пояснения модификации - например, если pubDate был Ср, 22 мая 2013 г. 17:09:36 + 0200 затем строка

$timestamp = strtotime($strtotimearg, $timestamp

сместила время на два часа, не сбрасывая его на + 0000 часовой пояс, как и ожидалось.

Ср, 22 мая 2013 г. 17:09:36 + 0200 показывает, что представленное здесь время находится в часовом поясе GMT ​​+2.

Код не работал должным образом и добавил дополнительные два часа ко времени, поэтому время стало Ср, 22 мая 2013 г. 19:09:36 + 0000 , вместо Ср,22 мая 2013 г. 15:09:36 + 0000 как и должно было быть.

...