Fonction PHP : parseDate()

Ici, vous pouvez voir (et copier/coller) le code complet de la fonction PHP parseDate(). N'hésitez pas voter pour cette fonction si elle vous plaît ou si vous vouv en servez !

parseDate() ajouté le 2009-07-03 14:29:03 par zebden

/**
parseDate() V2
@author Anthony Lombard
@desc reformate une date au format voulu
@param string $format format de base, param accéptés : d, m, Y, y, H, i, s.
@param string $date date que l'on veut transformer
@param string $newformat si indiqué 
	retourne la date parsé, sinon on retourne au format timestamp.
@return string / integer.
*/
function parseDate($format, $date, $newformat = '') {
	
	// INITIALISATION DES FLAGS
	$m = 1; $d = 1; $y = 1970; $h = 0; $i = 0; $s = 0;
	
	// on enlève tous les espaces.
	$format = strtolower($format);
	
	// Masque des séparateurs possible. 
	// Séparateurs qui passent : \ / : _ - ; et espace.
	$sep = '([\\\/:_;\s-]{1})';
	
	// On split avec les possibles séparateurs.
	$date   = preg_split($sep, $date);
	$format = preg_split($sep, $format);
	
	// On fait correspondre au format de la date.
	foreach($format as $key => $formatDate) {
		
		//  on vérifie si le format est numérique
		if(!preg_match('`^([0-9]{1,4})$`', $date[$key])) 
			return FALSE;
		
		$$formatDate = $date[$key];
		}
	
	// On ne prend pas en compte l'heure.
	$timestamp = mktime($h, $i, $s, $m, $d, $y);
	
	// Si on spécifie un nouveau format, on retourne la date formatée.
	if($newformat) return date($newformat, $timestamp);
	
	// Sinon on retourne la date au format timestamp donc integer.
	return (integer)$timestamp;
	}

Voter pour cette fonction


ParseDate permet de transformer n'importe quel format de date en un autre format choisi. Cela permet d'automatiser la convertion d'une date de type String en format Timestamp par exemple ou bien d'insérer facilement une date provenant d'un formulaire au format FR en Format SQL. Il suffit de renseigner la forme de la date avec les attributs habituels puis de renseigner sous quel format on veut la récupérer.

Commentaires sur la fonctions php

zebden 03/07/2009 à 14:30

Exemple en plus :

// Date quelconque que je veux rentrer en base.
$date = '24-04-1998 23:12';
$DATETIMESQL = parseDate('d-m-Y H:i', $date, 'Y-m-d H:i:s'); 
// retourne 1998-04-24 23:12:00
 
// Peu fréquent mais bon sait on jamais :
$date = '04-1982';
$DATETIMESQL = parseDate('m-Y', $date, 'Y-m-d H:i:s'); 
// retourne 1982-04-01 00:00:00

azlinch 04/08/2009 à 16:50

Salut,

Très bonne idée, je me permet 2 remarques :
- Petit soucis sur la suppression des espaces (C'était pour savoir si on suivait ?? :))
- Pour coller aux formats de la méthode date (http://fr.php.net/manual/fr/function.date.php), je pense qu'un switch permettrais d'avoir plus possibilités

// on enlève tous les espaces.
//$format = strtolower($format);
$format = str_replace( " ", "", $format );

//$$formatDate = $date[$key];
switch( $formatDate )
{
	case "d":
	case "j":
		$d = $date[$key];
		break;
	case "m":
		$m = $date[$key];
		break;
	case "Y":
		$y = $date[$key];
		break;
	case "y":
		$y = $date[$key] < 70 ? 2000 + $date[$key] : 1900 + $date[$key];
		break;
	...
}

azlinch 04/08/2009 à 17:07

Je m'auto flagelle.

Pas besoin de supprimer les espaces.

		// Masque des séparateurs possible. 
		// Séparateurs qui passent : \ / : _ - ; et espace.
		$sep = '([\\\/:_;\s-\ ]{1})';
		
		// On split avec les possibles séparateurs.
		$date   = preg_split( $sep, $value );
		$format = preg_split( $sep, $format );
		
		// On fait correspondre au format de la date.
		foreach( $format as $key => $formatDate )
		{
			//  on vérifie si le format est numérique
			if( !is_numeric( $date[$key] ) ) continue;

			switch( $formatDate )
			{
				case "d":
				case "j":
					$d = $date[$key];
					break;
				case "m":
					$m = $date[$key];
					break;
				case "Y":
					$y = $date[$key];
					break;
				case "y":
					$y = $date[$key] < 70 ? 2000 + $date[$key] : 1900 + $date[$key];
					break;
			}
		}

zebden 10/08/2009 à 16:00

Hello,

merci de ta contribution, en effet, je n'y avais absolument pas pensé.
Mais, du coup, j'ai fait des tests avant de modifier pour voir si en passant simplement un entier à deux chiffres dans la fonction mktime, tout ceci était pris en compte.
La réponse est oui, c'est pris en compte, mais je suis alors demandé si c'était pris en compte en 2069 par exemple avant 2070 en gros, et la réponse est non.
En fait tout fonctionne bien jusqu'en 2038 :

echo 'date ' . mktime(0,0,1, 1, 19, 2038); // renvoie 2147468401
echo 'date ' . mktime(0,0,1, 1, 20, 2038); // renvoie rien.

Donc pas besoin de checker la date pour y ajouter 1900 ou 2000.

Du fait que cela renvoie un entier signed sur 32bits (edit: confirmé dans la documentation php.net).

A plus !

Black hattitude 17/09/2009 à 07:17

Très intéressant :)