Strtotime étendu (str2time)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 463 fois - Téléchargée 34 fois

Contenu du snippet

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 / Exemple :


<?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);

A voir également

Ajouter un commentaire Commentaires
cs_winzou Messages postés 2 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 29 janvier 2005
29 janv. 2005 à 13:53
décidément :p
merci ;)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 9
29 janv. 2005 à 12:51
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 ++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.