Avec cette petite class je gère les dates plus facilement. Bien sûr on peut toujours l’améliorer pour lui rajouter la prise en charge de timestamp par exemple, je reste ouvert à vos suggestions.
/**
* transDater
*
* @package
* @author luc
* @copyright Copyright (c) 2012
* @version $Id$
* @access public
*/
/* la date en entrée doit être valide mais pas de type timestamp */
class TransDater {
/**
* TransDater::dateTransform()
*
* @param string $dateString
* @param mixed $newDateFormat
* @return
*/
static function dateTransform($dateString = '01-01-1979', $newDateFormat) {
if ($dateString && ($format = $newDateFormat)) {
$date = new DateTime($dateString);
return $date->format($format);
}
return (bool) false;
}
/**
* *Si on récupère le numéro du mois de l'année on peut le transformer en nom en toutes lettres
*/
static function monthTransformFr($date) {
static $mois = array(
'01' => 'janvier',
'02' => 'fevrier',
'03' => 'mars',
'04' => 'avril',
'05' => 'mai',
'06' => 'juin',
'07' => 'juillet',
'08' => 'aout',
'09' => 'septembre',
'10' => 'octobre',
'11' => 'novembre',
'12' => 'decembre'
);
$m = self::dateTransform($date, 'm');
if (!empty($mois[$m])) {
return (string) $mois[$m];
}
}
/**
* TransDater::dayWord()
* @abstract Si on récupère le numéro du jour de l'année on peut le transformer en nom en toutes lettres (0->français,1->Anglais,2->Allemand)
* @param mixed $date
* @param mixed $int
* @return
*/
static function dayWord($date, $int) {
$french = array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
$english = array('Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Monday');
$german = array('Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag', 'Montag');
switch ($int) {
case 0 : $day = $french;
break;
case 1: $day = $english;
break;
case 2: $day = $german;
break;
default:
false;
} // switch
$d = self::dateTransform($date, 'w');
if (!empty($day[$d])) {
return (string) $day[$d];
}
return (bool) false;
}
/* fonction : bissextile */
static function leapYear($date) {
$date = self::dateTransform($date, 'y-m-d');
if ((is_int($date / 4) && !is_int($date / 100)) || is_int($date / 400)) {
return (bool) true;
} else {
return (bool) false;
}
}
/**
* TransDater::datePlusUnMois()
*
* @abstract fonction rajoutant un mois a une date
* @param mixed $date
* @return string date plus 1 mois
*/
static function datePlusUnMois($date) {
$newDate = new DateTime($date);
$newDate->modify('+1 month');
return (string) $newDate->format('Y-m-d');
}
/**
* TransDater::dateMoinsUnJour(()
*
* @abstract fonction enlevant 1 jour à une date
* @param mixed $date
* @return string date moins 1 jour
*/
static function dateMoinsUnJour($date) {
$newDate = new DateTime($date);
return $newDate->modify('-1 day');
}
/**
* TransDater::age()
*
* @abstract Fonction pour calculer l'age
* @param string date de naissance type 'd/m/Y'
* @param string date à laquelle on veux calculer l'age
* @return age /integer
*/
static function age($date_naissance, $currentDate = NULL) {
if ($date_naissance != NULL) {
if ($currentDate == NULL) {
$currentDate = date('d/m/Y');
}
}
$arr1 = explode('/', $date_naissance);
$arr2 = explode('/', $currentDate);
if (($arr1[1] < $arr2[1]) || (($arr1[1] == $arr2[1]) && ($arr1[0] <= $arr2[0]))) {
return $arr2[2] - $arr1[2];
}
return (int) $arr2[2] - $arr1[2] - 1;
}
/**
* returns the difference, in days, between two dates. avoids the daylight's savings issue by using GMT
*/
static function dateDiff($date1, $date2) {
$date1 = date_parse($date1);
$date2 = date_parse($date2);
return ((gmmktime(0, 0, 0, $date1['month'], $date1['day'], $date1['year']) - gmmktime(0, 0, 0, $date2['month'], $date2['day'], $date2['year'])) / 3600 / 24);
}
/**
* @name dateExcelToHuman()
* @param string $date
* @return string date
*/
static function dateExcelToHuman($date) {
$date = ($date - 25569) * 86400;
return (string) date('Y-m-d H:i:s', $date);
}
/**
* @abstract Returns elapsed time with human format in french
*
* @param int The timestamp of the date
* @return string
*/
public function elapsed_time($date) {
$old_time = $date;
// Current time
$time = time();
// Little check
if ($time < $old_time) {
return FALSE;
}
// Get seconds elapsed
$seconds = round($time - $old_time);
// Convert into minutes
$minutes = round($seconds / 60);
// Convert into hours
$hours = round($minutes / 60);
// Returns
if ($hours >= 72) {
return 'Le ' . date('d/m/Y', $old_time);
} elseif ($hours >= 48 && $hours < 72) {
return 'Avant Hier';
} elseif ($hours >= 24 && $hours < 48) {
return 'Hier';
} elseif ($hours >= 1) {
return 'Il y a ' . $hours . ' h';
} elseif ($minutes >= 1) {
return 'Il y a ' . $minutes . ' mn';
} elseif ($seconds == 0) {
return 'A l\'instant';
} else {
return 'Il y a ' . $seconds . ' s';
}
}
static public function addSeconde(\DateTime $date, $seconde) {
return self::addInterval($date, 'PT' . (int) $seconde . 'S');
}
static public function addMonth(\DateTime $date, $month) {
return self::addInterval($date, 'P' . (int) $month . 'M');
}
static public function addDay(\DateTime $date, $day) {
return self::addInterval($date, 'P' . (int) $day . 'D');
}
static public function addYear(\DateTime $date, $year) {
return self::addInterval($date, 'P' . (int) $year . 'Y');
}
static public function addInterval(\DateTime $date, $value) {
try {
$interval = new \DateInterval($value);
$date->add($interval);
} catch (Exception $exc) {
throw new \Exception(__METHOD__ . 'The format of $value is not valid (String) exemple : P55S (add 55 second) ');
}
return $date;
}
}
à bientôt Grand maître L
Laisser un commentaire