d4d081df2b518b1fbb56ce86dec2450aa2035385
4 if (!defined("_ECRIRE_INC_VERSION")) return;
7 * Une date au format JJ/MM/AAAA (avec séparateurs souples : espace / - .)
9 * - format : permet de préciser le format de la date jma pour jour/mois/année (par défaut), mja (pour mois / jour / année), amj (année/mois/jour)
10 * TODO : compléter les formats
11 * On pourrait faire mieux, genre vérifier les jours en fonction du mois
12 * Mais c'est pas très important, on reste simple
14 * @param string|array $valeur
15 * La valeur à vérifier, en chaîne pour une date seule, en tableau contenant deux entrées "date" et "heure" si on veut aussi l'heure
16 * @param array $options
18 * @param null $valeur_normalisee
19 * Si normalisation a faire, la variable sera rempli par la date normalisee.
21 * Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
23 function verifier_date_dist($valeur, $options=array(), &$valeur_normalisee=null){
24 $erreur = _T('verifier:erreur_date_format');
25 $horaire = false; // par défaut on ne teste qu'une date
27 // Si ce n'est ni une chaîne ni un tableau : pas le bon format
28 if (!is_string($valeur) and !is_array($valeur))
31 // Si c'est un tableau
32 if (is_array($valeur)) {
33 // S'il y a les bonnes infos on les garde aux bons endroits
35 isset($valeur['date']) and is_string($valeur['date'])
36 and isset($valeur['heure']) and is_string($valeur['heure'])
38 $options['heure'] = $valeur['heure']; // l'heure pour la fonction de normalisation
39 $valeur = $valeur['date']; // valeur principale pour la date
40 $horaire = true; // on détecte une vérif avec horaire uniquement dans ce cas
42 // Sinon : pas le bon format
50 // On tolère différents séparateurs
51 $valeur = preg_replace("#\.|/| #i",'-',$valeur);
53 // On vérifie la validité du format
54 $format = isset($options['format']) ?
$options['format'] : 'jma';
57 if(!preg_match('#^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$#',$valeur)) return $erreur;
58 list($mois,$jour,$annee) = explode('-',$valeur);
59 } elseif ($format=='amj') {
60 if(!preg_match('#^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$#',$valeur)) return $erreur;
61 list($annee,$mois,$jour) = explode('-',$valeur);
63 // Format jma par défaut
64 if(!preg_match('#^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$#',$valeur)) return $erreur;
65 list($jour,$mois,$annee) = explode('-',$valeur);
68 // Validité de la date
69 $erreur = _T('verifier:erreur_date');
70 if (!checkdate($mois, $jour, $annee)) return $erreur;
74 $options['heure'] = str_replace(array('h','m','min'), array(':','',''), $options['heure']);
75 if (!preg_match('#^([0-9]{1,2}):([0-9]{1,2})$#', $options['heure'], $hetm)) {
76 return _T('verifier:erreur_heure_format');
78 // Si c'est le bon format, on teste si les nombres donnés peuvent exister
80 $heures = intval($hetm[1]);
81 $minutes = intval($hetm[2]);
82 if ($heures < 0 or $heures > 23 or $minutes < 0 or $minutes > 59){
83 return _T('verifier:erreur_heure');
85 // Si tout est bon pour l'heure, on recompose en ajoutant des 0 si besoin
87 $options['heure'] = sprintf('%02d:%02d', $heures, $minutes);
91 // normaliser si demandé
92 if ($options['normaliser'] and $options['normaliser'] == 'datetime') {
93 $valeur_normalisee = normaliser_date_datetime_dist($valeur, $options, $ok);
103 * Convertir une date en datetime
106 function normaliser_date_datetime_dist($valeur, $options, &$erreur) {
107 $defaut = '0000-00-00 00:00:00';
113 $date = str_replace('-', '/', $valeur); // formater en jj/mm/aaaa
115 if (isset($options['heure'])) {
116 $date .= (' ' . $options['heure'] . ':00');
118 $date .= ' 00:00:00';
121 include_spip('inc/filtres');
122 if (!$date = recup_date($date)) {
123 $erreur = "Impossible d'extraire la date de $date";
127 if (!($date = mktime($date[3], $date[4], 0, (int)$date[1], (int)$date[2], (int)$date[0]))) {
128 // mauvais format de date
129 $erreur = "Impossible de normaliser la date...";
133 $date = date("Y-m-d H:i:s", $date);
134 $date = vider_date($date); // enlever les valeurs considerees comme nulles (1 1 1970, etc...)