wyzen/phpcore-datetime

Manage Datetime with opened/closed days

Maintainers

Package info

gitlab.com/wyzen-packages/phpcore-datetime

Homepage

Issues

pkg:composer/wyzen/phpcore-datetime

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

v2.0.0 2026-05-07 13:06 UTC

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 style strftime (tokens %...).

Fonctionnalités

  • Initialisation flexible

    • Depuis un timestamp
    • Depuis une chaîne au format SQL (YYYY-MM-DD ou YYYY-MM-DD HH:MM:SS)
    • Depuis une chaîne au format français (D/M/YYYY ou DD/MM/YYYY, avec ou sans heure)
    • Depuis une semaine ISO (YYYY/S01)
  • Formatage & conversions (statiques)

    • Datetime::dateToSql($date)YYYY-MM-DD HH:MM:SS.0
    • Datetime::dateToString($date, $format) (vers format type strftime)
    • Datetime::dateTimeToString($date, $format) (idem, format défaut %d/%m/%Y à %kh%M)
    • Datetime::dateTimeToSql($datetime) (FR D/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 de YYYYMM)
    • 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és YYYYMMDD)
    • $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, 0 ou 1
    • $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 via DateTimeAbstract mais 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]