php - Convierte RSS pubDate en una marca de tiempo
timestamp (5)
Cómo convertir una cadena de fecha Mon, 24 May 2010 17:54:00 GMT
desde el feed RSS a una marca de tiempo en PHP?
strtotime
no funciona con diferentes zonas horarias.
Acabo de escribir esta función para convertir RSS pubDates a marcas de tiempo que tiene en cuenta las diferentes zonas horarias:
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;
}
Puede usar la función strtotime()
. Toma una cadena de fecha como primer argumento y devuelve una marca de tiempo de Unix.
Prueba esto:
$pubDate = $item->pubDate;
$pubDate = strftime("%Y-%m-%d %H:%M:%S", strtotime($pubDate));
La función rsstotime () no funcionaba correctamente si el feed pubDate en rss tenía una zona horaria distinta de +0000 . El problema era con el modificador $, tenía que ser revertido. Para arreglar esas dos líneas tenía que ser agregada, entonces la línea:
$modifier = substr($timezone, 0, 1);
convirtió:
$modifier = substr($timezone, 0, 1);
if($modifier == "+"){ $modifier = "-"; } else
if($modifier == "-"){ $modifier = "+"; }
Solo para aclarar la modificación, por ejemplo, si el pubDate fue Wed, 22 de mayo de 2013 17:09:36 +0200, entonces la fila
$timestamp = strtotime($strtotimearg, $timestamp
se ha compensado el tiempo por dos horas y no se ha restablecido a la zona horaria +0000 como se esperaba.
The Wed, 22 de mayo de 2013 17:09:36 +0200 muestra que el tiempo presentado aquí está en la zona horaria GMT +2.
El código no funcionó correctamente y agregó dos horas adicionales al tiempo, por lo que llegó la hora Mié, 22 de mayo de 2013 19:09:36 +0000 , en cambio Mié, 22 de mayo de 2013 15:09:36 +0000, ya que debería haber sido .
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;
}
Prueba esta función