begin process at 2012 05 27 20:28:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > STRTOTIME ÉTENDU (STR2TIME)

STRTOTIME ÉTENDU (STR2TIME)


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date / Heure Niveau :Initié Date de création :29/01/2005 Date de mise à jour :29/01/2005 13:51:42 Vu :3 342

Auteur : winzou

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Une fonction qui fait un strtotime, mais en mieux ;p

Au lieu d'essayer de reconnaitre le format toute seule, et donc peu de formats, cette fonction requière le format en argument, et en tire le timestamp.

Pratique pour récupérer le timestamp d'une date dont vous connaissez seulement la chaine de caractère et son format.

Source

  • <?php
  • //----------------------------------------//
  • // str2time.php
  • // Fonction str2time()
  • //----------------------------------------//
  • // Auteur : winzou
  • // Date de création : 15/09/04
  • // Date de dernière modification : 15/09/04
  • //----------------------------------------//
  • /*
  • * Cette fonction permet de récupérer le timestamp d'une date string d'après son format
  • * Le format est celui de la fonction date (cf http://php.net/date)
  • */
  • function str2time($date,$format)
  • {
  • $key_letter = array('a','A','B','c','d','D','g','G','h','H','i','I','j','l','m','M','n','O','r','s','S','t','U','w','W','Y','y','z','Z');
  • $esc_regex_before = array('?','+','.','*','\\');
  • $esc_regex_after = array();
  • foreach($esc_regex_before as $data)
  • {$esc_regex_after[] = '\\'.$data;}
  • $regex = '^'.str_replace($key_letter,'(.*?)',str_replace($esc_regex_before,$esc_regex_after,$format)).'$';
  • preg_match('`'.$regex.'`',$format,$index_output);
  • preg_match('`'.stripslashes(stripslashes($regex)).'`',$date,$value_output);
  • $total = count($value_output)
  • for($i=1;$i<$total;$i++)
  • {$array_date[$index_output[$i]] = $value_output[$i];}
  • $final_date['heure'] = 0;
  • $final_date['min'] = 0;
  • $final_date['sec'] = 0;
  • $final_date['mois'] = 0;
  • $final_date['jour'] = 0;
  • $final_date['annee'] = 0;
  • $final_date['dec'] = 0;
  • $array_mois = array('Jan' => 1,'Feb' => 2,'Mar' => 3,'Apr' => 4,'May' => 5,'Jun' => 6,'Jul' => 7,'Aug' => 8,'Sep' => 9,'Oct' => 10,'Nov' => 11,'Dec' => 12);
  • $array_mois_long = array('January' => 1,'February' => 2,'March' => 3,'April' => 4,'May' => 5,'June' => 6,'July' => 7,'August' => 8,'September' => 9,'October' => 10,'November' => 11,'December' => 12);
  • foreach($array_date as $key => $data)
  • {
  • if(isset($format{strpos($format,$key)-1}))
  • {
  • if($format{strpos($format,$key)-1} == '\\')
  • {continue;}
  • }
  • switch($key)
  • {
  • case 'd':
  • $final_date['jour'] = $data;
  • break;
  • case 'm':
  • case 'j':
  • $final_date['mois'] = $data;
  • break;
  • case 'Y':
  • case 'y':
  • $final_date['annee'] = $data;
  • break;
  • case 'a':
  • case 'A':
  • if($data == 'pm')
  • {$final_date['heure'] = $final_date['heure'] + 12;}
  • break;
  • case 'g':
  • case 'h':
  • case 'G':
  • case 'H':
  • $final_date['heure'] = $data;
  • break;
  • case 'i':
  • $final_date['min'] = $data;
  • break;
  • case 's':
  • $final_date['sec'] = $data;
  • break;
  • case 'F':
  • $final_date['mois'] = $array_mois_long[$data];
  • break;
  • case 'M':
  • $final_date['mois'] = $array_mois[$data];
  • break;
  • case 'c':
  • return str2time($data,'Y-m-dTH:i:s+00:00');
  • break;
  • case 'r':
  • return str2time($data,'D, d M Y H:i:s +0000');
  • break;
  • case 'I':
  • if($data == 0)
  • {$final_date['dec'] -= 3600;}
  • break;
  • } // switch
  • }
  • $time = mktime($final_date['heure'],$final_date['min'],$final_date['sec'],$final_date['mois'],$final_date['jour'],$final_date['annee']) + $final_date['dec'];
  • return $time;
  • }
  • // echo str2time('18/08/04 1:21:22 pm','d/m/Y h:i:s a');
  • ?>
<?php
//----------------------------------------//
// str2time.php
// Fonction str2time()
//----------------------------------------//
// Auteur : winzou
// Date de création : 15/09/04
// Date de dernière modification : 15/09/04
//----------------------------------------//

/*
* Cette fonction permet de récupérer le timestamp d'une date string d'après son format
* Le format est celui de la fonction date (cf http://php.net/date)
*/
function str2time($date,$format)
{
$key_letter = array('a','A','B','c','d','D','g','G','h','H','i','I','j','l','m','M','n','O','r','s','S','t','U','w','W','Y','y','z','Z');

$esc_regex_before = array('?','+','.','*','\\');
$esc_regex_after  = array();
foreach($esc_regex_before as $data)
    {$esc_regex_after[] = '\\'.$data;}

$regex = '^'.str_replace($key_letter,'(.*?)',str_replace($esc_regex_before,$esc_regex_after,$format)).'$';

preg_match('`'.$regex.'`',$format,$index_output);
preg_match('`'.stripslashes(stripslashes($regex)).'`',$date,$value_output);

$total = count($value_output)
for($i=1;$i<$total;$i++)
    {$array_date[$index_output[$i]] = $value_output[$i];}

$final_date['heure'] = 0;
$final_date['min']   = 0;
$final_date['sec']   = 0;
$final_date['mois']  = 0;
$final_date['jour']  = 0;
$final_date['annee'] = 0;
$final_date['dec']   = 0;


$array_mois      = array('Jan' => 1,'Feb' => 2,'Mar' => 3,'Apr' => 4,'May' => 5,'Jun' => 6,'Jul' => 7,'Aug' => 8,'Sep' => 9,'Oct' => 10,'Nov' => 11,'Dec' => 12);
$array_mois_long = array('January' => 1,'February' => 2,'March' => 3,'April' => 4,'May' => 5,'June' => 6,'July' => 7,'August' => 8,'September' => 9,'October' => 10,'November' => 11,'December' => 12);


foreach($array_date as $key => $data)
    {
    if(isset($format{strpos($format,$key)-1}))
        {
        if($format{strpos($format,$key)-1} == '\\')
            {continue;}
        }
    
    switch($key)
    {
    case 'd':
        $final_date['jour'] = $data;
        break;
    
    case 'm':
    case 'j':
        $final_date['mois'] = $data;
        break;
    
    case 'Y':
    case 'y':
        $final_date['annee'] = $data;
        break;
    
    case 'a':
    case 'A':
        if($data == 'pm')
            {$final_date['heure'] = $final_date['heure'] + 12;}
        break;
    
    case 'g':
    case 'h':
    case 'G':
    case 'H':
        $final_date['heure'] = $data;
        break;
    
    case 'i':
        $final_date['min'] = $data;
        break;
    
    case 's':
        $final_date['sec'] = $data;
        break;
    
    case 'F':
        $final_date['mois'] = $array_mois_long[$data];
        break;
    
    case 'M':
        $final_date['mois'] = $array_mois[$data];
        break;
    
    case 'c':
        return str2time($data,'Y-m-dTH:i:s+00:00');
        break;
    
    case 'r':
        return str2time($data,'D, d M Y H:i:s +0000');
        break;
    
    case 'I':
        if($data == 0)
            {$final_date['dec'] -= 3600;}
        break;

    } // switch
    }

    
$time = mktime($final_date['heure'],$final_date['min'],$final_date['sec'],$final_date['mois'],$final_date['jour'],$final_date['annee']) + $final_date['dec'];

return $time;
}

// echo str2time('18/08/04 1:21:22 pm','d/m/Y h:i:s a');

?> 

 Conclusion

Je n'ai pas beaucoup testée cette fonction sur des formats complexes et tiré par les cheveux. J'entend par la qu'il peut y avoir des problèmes avec les antislashes par exemple.

Mais pour une utilisation normale, aucun problème. Voici d'ailleurs un exemple :

$format = 'd/m/Y h:i:s a';
$date = '18/08/04 1:21:22 pm';

$time = str2time($date,$format);


 Historique

29 janvier 2005 13:51:42 :
retiré le count du for pour le mettre dans la var $total

 Sources du même auteur

GESTION FICHIER DE CONFIGURATION
COULEUR ALÉATOIRE HTML (HEXADECIMAL)

 Sources de la même categorie

Source avec une capture AGENDA GRAPHIQUE SIMPLE (DÉBUTANT) À INTÉGRER par NicomakM
CALCUL DU NOMBRE DE JOURS CONTENUS DANS L'INTERSECTION DE DE... par curphey
CALENDRIER EN 70 LIGNES par tchconst
Source avec Zip CALENDRIER par gabay
CALENDRIER SIMPLE par manuche

Commentaires et avis

Commentaire de Anthomicro le 29/01/2005 12:51:50

Salut ;-)

Juste un petit truc à remplacer :

for($i=1;$i<count($value_output);$i++)

par ça :
$count_value=count($value_output);
for($i=1;$i<$count_value;$i++)
{
$array_date[$index_output[$i]] = $value_output[$i];
}

Voilà, très bon code sinon ;-)

Je te mets 9/10

a ++

Commentaire de winzou le 29/01/2005 13:53:18

décidément :p
merci ;)

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales