Ignore:
Timestamp:
May 11, 2013, 11:22:15 AM (7 years ago)
Author:
cedric@…
Message:

http://core.spip.org/issues/2889 :
Certaines dates de flux ont formatees dans la langue du flux et non en anglais. On essaye de remplacer le nom des mois par le nom anglais pour interpreter la date
Certaines dates finissent par UT au lieu de UTC qui bloque la conversion par strtotime, on corrige si necessaire

Quand on a pas reussi a lire la date, il faut forcer a la date du jour et pas laisser 1970

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _core_/branches/spip-3.0/plugins/sites/inc/syndic.php

    r70317 r72733  
    127127                $item,$match)) {
    128128                        cdata_echappe_retour($match[2], $echappe_cdata);
    129                         $la_date = my_strtotime($match[2]);
     129                        $la_date = my_strtotime($match[2], $langue_du_site);
    130130                }
    131131                if (!$la_date AND
    132132                preg_match(',<(pubdate)>([^<]*)<,Uims',$item, $match)) {
    133133                        cdata_echappe_retour($match[2], $echappe_cdata);
    134                         $la_date = my_strtotime($match[2]);
     134                        $la_date = my_strtotime($match[2], $langue_du_site);
    135135                }
    136136                if (!$la_date AND
    137137                preg_match(',<([a-z]+:date)>([^<]*)<,Uims',$item,$match)) {
    138138                        cdata_echappe_retour($match[2], $echappe_cdata);
    139                         $la_date = my_strtotime($match[2], $echappe_cdata);
     139                        $la_date = my_strtotime($match[2], $langue_du_site);
    140140                }
    141141                if (!$la_date AND
    142142                preg_match(',<date>([^<]*)<,Uims',$item,$match)) {
    143143                        cdata_echappe_retour($match[1], $echappe_cdata);
    144                         $la_date = my_strtotime($match[1]);
     144                        $la_date = my_strtotime($match[1], $langue_du_site);
    145145                }
    146146
     
    150150                // plus lourd que vraiment utile)
    151151                if ($GLOBALS['controler_dates_rss']) {
    152                         if ($la_date > time() + 48 * 3600)
     152                        if (!$la_date
     153                                OR $la_date > time() + 48 * 3600)
    153154                                $la_date = time();
    154155                }
     
    160161                if (preg_match(',<(lastbuilddate|updated|modified)>([^<>]+)</\1>,i',
    161162                $item, $regs)
    162                 AND $lastbuilddate = my_strtotime(trim($regs[2]))
     163                AND $lastbuilddate = my_strtotime(trim($regs[2]), $langue_du_site)
    163164                // pas dans le futur
    164165                AND $lastbuilddate < time())
     
    291292// http://www.w3.org/TR/NOTE-datetime
    292293// http://doc.spip.org/@my_strtotime
    293 function my_strtotime($la_date) {
    294 
     294function my_strtotime($la_date, $lang=null) {
    295295        // format complet
    296296        if (preg_match(
     
    310310                return strtotime($match[0]."-01");
    311311
    312         // utiliser strtotime en dernier ressort
    313         $s = strtotime($la_date);
    314         if ($s > 0)
    315                 return $s;
    316 
    317312        // YYYY-MM-DD hh:mm:ss
    318313        if (preg_match(',^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\b,', $la_date, $match))
    319314                return strtotime($match[0]);
    320315
     316        // utiliser strtotime en dernier ressort
     317        // en nettoyant le jour qui prefixe parfois la date, suivi d'une virgule
     318        // et les UT qui sont en fait des UTC
     319        $la_date_c = preg_replace("/^\w+,\s*/ms","",$la_date);
     320        $la_date_c = preg_replace("/UT\s*$/ms","UTC",$la_date_c);
     321        if ($s=strtotime($la_date)
     322          OR $s=strtotime($la_date_c))
     323                return $s;
     324
     325        // essayons de voir si le nom du mois est dans la langue du flux et remplacons le
     326        // par la version anglaise avant de faire strtotime
     327        if ($lang){
     328                // "fr-fr"
     329                $lang = reset(explode("-",$lang));
     330                static $months = null;
     331                if (!isset($months[$lang])){
     332                        $prev_lang = $GLOBALS['spip_lang'];
     333                        changer_langue($lang);
     334                        foreach(range(1,12) as $m){
     335                                $s = _T("date_mois_$m");
     336                                $months[$lang][$s] = date("M",strtotime("2013-$m-01"));
     337                                $s = _T("date_mois_".$m."_abbr");
     338                                $months[$lang][$s] = date("M",strtotime("2013-$m-01"));
     339                                $months[$lang][trim($s,".")] = date("M",strtotime("2013-$m-01"));
     340                        }
     341                        changer_langue($prev_lang);
     342                }
     343                spip_log($la_date_c,"dbgs");
     344                foreach($months[$lang] as $loc=>$en){
     345                        if (stripos($la_date_c,$loc)!==false){
     346                                $s=str_ireplace($loc,$en,$la_date_c);
     347                                if ($s=strtotime($s))
     348                                        return $s;
     349                        }
     350                }
     351        }
    321352
    322353        // erreur
Note: See TracChangeset for help on using the changeset viewer.