Strtotime étendu (str2time)

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

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.