Strtotime étendu (str2time)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 300 fois - Téléchargée 32 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
Messages postés
2
Date d'inscription
dimanche 31 août 2003
Statut
Membre
Dernière intervention
29 janvier 2005

décidément :p
merci ;)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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.