2010-05-26 8 views

Répondre

10

Vous pouvez utiliser la fonction intégrée strtotime(). Il prend une chaîne de date comme premier argument et renvoie un horodatage Unix.

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

+2

Il ressemble à strtotime donnent des résultats étranges lorsque la chaîne contient le fuseau horaire. Par exemple avec "Sam, 21 Sep 2010 00:00 GMT" Je reçois 1285372800 (25-09-2010) –

12

Essayez ceci:

$pubDate = $item->pubDate; 
$pubDate = strftime("%Y-%m-%d %H:%M:%S", strtotime($pubDate)); 
+0

Excelent! Fonctionne comme un charme – Borjante

7

strtotime ne fonctionne pas avec des fuseaux horaires différents.

Je viens d'écrire cette fonction pour convertir RSS pubDates à horodatages qui ne prend en compte les différents fuseaux horaires:

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

Cela a fonctionné parfaitement. Je vous remercie! –

0

La fonction rsstotime() ne fonctionnait pas correctement si le pubDate dans l'alimentation rss avait fuseau horaire autre que +0000. Le problème était avec le modificateur $, il a dû être inversé. Pour résoudre ce problème deux lignes devaient être ajoutées, de sorte que la ligne:

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

est devenu:

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

Juste pour clarifier la modification - par exemple si le pubDate était mer, le 22 mai 2013 17:09:36 +0200 puis la ligne

$timestamp = strtotime($strtotimearg, $timestamp 

offsetted le temps de deux heures à ne pas remis à zéro +0000 timezone comme prévu.

Le Mer, 22 Mai 2013 17:09:36 +0200 montre que l'heure présentée ici est dans le fuseau horaire GMT +2.

Le code ne fonctionne pas correctement et a ajouté deux heures supplémentaires pour le temps, de sorte que le temps est devenu Mer, le 22 mai 2013 19:09:36 +0000, au lieu mer, 22 mai 2013 15:09:36 +0000 comme il se doit.

-3
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; 
} 

Essayez cette fonction

Questions connexes