wyzen / phpcore-datetime
Manage Datetime with opened/closed days
v2.0.0
2026-05-07 13:06 UTC
Requires
- php: ^8.4
Requires (Dev)
- behat/behat: ^3.23
- friendsofphp/php-cs-fixer: ^3.76
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.5
- squizlabs/php_codesniffer: ^3.13
This package is not auto-updated.
Last update: 2026-05-08 02:56:37 UTC
README
Librairie PHP pour manipuler des dates/heures, convertir des formats courants (SQL / français) et calculer des délais calendaires ou en jours ouvrés (week-ends + jours fériés FR).
Prérequis
- PHP 8.4+
Installation
composer require wyzen/phpcore-datetime
Architecture
Wyzen\phpCore\Datetime— API publique moderne (camelCase anglais).Wyzen\phpCore\DateTimeAbstract— classe abstraite parente regroupant les wrappers historiques@deprecated(rétro-compatibilité). À ne plus utiliser dans le nouveau code.Wyzen\phpCore\Support\AnalyseurDate— parsing des entrées (SQL / FR / semaine ISO).Wyzen\phpCore\Support\FormateurStrftime— formatage stylestrftime(tokens%...).
Fonctionnalités
Initialisation flexible
- Depuis un timestamp
- Depuis une chaîne au format SQL (
YYYY-MM-DDouYYYY-MM-DD HH:MM:SS) - Depuis une chaîne au format français (
D/M/YYYYouDD/MM/YYYY, avec ou sans heure) - Depuis une semaine ISO (
YYYY/S01)
Formatage & conversions (statiques)
Datetime::dateToSql($date)→YYYY-MM-DD HH:MM:SS.0Datetime::dateToString($date, $format)(vers format type strftime)Datetime::dateTimeToString($date, $format)(idem, format défaut%d/%m/%Y à %kh%M)Datetime::dateTimeToSql($datetime)(FRD/M/YYYY HH:MM→ SQL)Datetime::sqlToDate($date, $format)/Datetime::sqlToDateTime($datetime, $separator)Datetime::dateToWeek($date)→YYYY/SWW- Méthode d'instance :
$dt->toSql()→YYYY-MM-DD HH:MM:SS.0 - Méthode d'instance :
$dt->format('%...')
Validation & calendrier
Datetime::validateDate($date, $format = 'DD/MM/YYYY')Datetime::checkdate($month, $day, $year)Datetime::getEasterDate($year)(timestamp du dimanche de Pâques)Datetime::getYearMonth()/Datetime::getPreviousYearMonth()(YYYYMM)Datetime::getRollingYearMonths($yearMonth, $count)(liste glissante deYYYYMM)Datetime::getMonthName($n)/Datetime::getMonthAbbreviation($n)Datetime::getMonthYear(...)/Datetime::getMonthYearShort(...)
Jours ouvrés & jours fériés FR
$dt->setWorkingDaysMode(true)pour activer le mode ouvré$dt->isHoliday($date = null)indique si la date est un jour férié$dt->isWorkingDay()indique si la date est un jour ouvré$dt->getFirstWorkingDay()premier jour ouvré du mois courant$dt->getHolidays()liste des fériés (clésYYYYMMDD)$dt->setHolidays($year)(re)calcule les jours fériés pour une année
Calculs & helpers
$dt->addDays($n)/$dt->subDays($n)(calendaire ou ouvré selon le flag)$dt->addHours($n),$dt->addMinutes($n),$dt->addMonths($n),$dt->subMonths($n)$dt->diff($autre)retourne{j, jo}(jours calendaires & ouvrés)$dt->equals($autre)retourne-1,0ou1$dt->isLeapYear()- Accesseurs :
getTimestamp(),getYear(),getMonth(),getDay(),getWeek(),getDayOfYear(),getDayOfWeek(),getDaysInMonth() Datetime::getDayCount($tsStart, $tsEnd, $useWorkingDays = true)Datetime::getPeriod($start, $end, $rollingMonths = false)
Toutes les anciennes méthodes (
date2sql,set_date,add_days,EstFerie,get_ts, …) restent disponibles viaDateTimeAbstractmais sont@deprecated. Elles continuent de fonctionner sans rupture.
Exemples
Création d'un objet Datetime
use Wyzen\phpCore\Datetime;
$dt1 = new Datetime(); // maintenant
$dt2 = new Datetime(time()); // depuis un timestamp
$dt3 = new Datetime('2018-09-05 10:12:30'); // SQL datetime
$dt4 = new Datetime('05/09/2018'); // date française
$dt5 = new Datetime('2018/S36'); // semaine ISO (S36)
// Initialisation a posteriori
$dt = new Datetime();
$dt->setDate('05/09/2018');
$dt->setTimestamp(time());
Conversions SQL / format français
use Wyzen\phpCore\Datetime;
// FR -> SQL
$sql = Datetime::dateToSql('05/09/2018'); // "2018-09-05 00:00:00.0"
// SQL -> string FR
$str = Datetime::sqlToDate('2018-09-05', '%d/%m/%Y'); // "05/09/2018"
// SQL datetime -> string FR
$strDateHeure = Datetime::sqlToDateTime('2018-09-05 10:12:30', ' à '); // "05/09/2018 à 10h12"
// Date -> semaine ISO
$sem = Datetime::dateToWeek('05/09/2018'); // "2018/S36"
Formatage
Le format est basé sur des tokens de type strftime (ex: %Y, %m, %d, %H, %M, %S, %W, %j, %B, %b, %k).
use Wyzen\phpCore\Datetime;
$dt = new Datetime('2018-09-05 10:12:30');
echo $dt->format('%Y-%m-%d %H:%M'); // "2018-09-05 10:12"
echo $dt->format('%d/%m/%Y à %kh%M'); // "05/09/2018 à 10h12"
echo $dt->toSql(); // "2018-09-05 10:12:30.0"
Validation
use Wyzen\phpCore\Datetime;
$ts = Datetime::validateDate('05/09/2018'); // timestamp
$ts = Datetime::validateDate('2018-09-05', 'YYYY-MM-DD');
$ko = Datetime::validateDate('31/02/2018'); // false
Jours fériés & jours ouvrés
use Wyzen\phpCore\Datetime;
$dt = new Datetime('2018-12-25');
var_dump($dt->isHoliday()); // true (Noël)
$dt = new Datetime('2018-12-24');
var_dump($dt->isHoliday()); // false
$dt = new Datetime('2018-09-08'); // samedi
var_dump($dt->isWorkingDay()); // false
Ajouter / retirer des jours (calendaires ou ouvrés)
use Wyzen\phpCore\Datetime;
$dt = new Datetime('2018-09-05 10:12:30');
$dt->addDays(5);
echo $dt->format('%Y-%m-%d'); // "2018-09-10"
$dt = new Datetime('2018-09-05 10:12:30');
$dt->setWorkingDaysMode(true);
$dt->addDays(28);
echo $dt->format('%Y-%m-%d'); // ~28 jours ouvrés plus tard
Différences entre deux dates
use Wyzen\phpCore\Datetime;
$debut = new Datetime('2018-09-05');
$fin = new Datetime('2018-09-10');
$debut->setWorkingDaysMode(true);
$fin->setWorkingDaysMode(true);
$diff = $debut->diff($fin);
// $diff->j : délai en jours calendaires (inclusif)
// $diff->jo : délai en jours ouvrés (week-ends + fériés FR)
Périodes (libellés)
use Wyzen\phpCore\Datetime;
$periode = Datetime::getPeriod('2018-09-05', '10/09/2019');
// [
// 'lib' => 'Septembre 2018 - Septembre 2019',
// 'shortlib' => 'SEP 2018 - SEP 2019',
// 'start' => Datetime(...),
// 'end' => Datetime(...),
// ]
Mois glissants
use Wyzen\phpCore\Datetime;
$mois = Datetime::getRollingYearMonths('201809', 6);
// [201804, 201805, 201806, 201807, 201808, 201809]