modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2025-10-22 15:43:03 +04:00
parent 3ef592aba5
commit 2e4fe05467
9 changed files with 0 additions and 570 deletions

View File

@ -1,16 +0,0 @@
<?php
namespace nulib\php\time;
class Hour extends Time {
const UNIT = self::UNIT_MINUTES;
const FORMAT = "%hh%M";
function format(?string $format=null): string {
$string = parent::format($format);
if (substr($string, -3) == "h00") {
$string = substr($string, 0, -2);
}
return $string;
}
}

View File

@ -1,288 +0,0 @@
<?php
namespace nulib\php\time;
use DateTimeInterface;
use nulib\exceptions;
use nulib\php\types\vbool;
use nulib\php\types\vint;
/**
* Class Time: une heure allant de 0h à 24h inclus.
*
* la seule utilisation autorisée de "24h" est comme borne supérieure pour une
* plage horaire.
*/
class Time {
const UNIT_HOURS = 3600;
const UNIT_MINUTES = 60;
const UNIT_SECONDS = 1;
const PATTERNS = [
'/^(\d+)[:.h](\d+)(?:[:.](\d+))?$/',
'/^(\d+)h(?:(\d+)(?:[:.](\d+))?)?$/'
];
/** @var string format par défaut pour l'affichage */
const FORMAT = "%H:%M:%S";
static function with($time): self {
if ($time instanceof static) return $time;
else return new static($time);
}
static function withn($time): ?self {
if ($time === null) return null;
elseif ($time instanceof static) return $time;
else return new static($time);
}
static function isa_time($time): bool {
if ($time === null) return false;
if ($time instanceof self) return true;
if (is_int($time)) return true;
if (is_string($time)) {
foreach (self::PATTERNS as $pattern) {
if (preg_match($pattern, $time)) return true;
}
}
if ($time instanceof DateTimeInterface) return true;
if (is_array($time) && count($time) == 3) return true;
return false;
}
protected static function s_now(): int {
$hms = date('His');
return intval(substr($hms, 0, 2)) * 3600
+ intval(substr($hms, 2, 2)) * 60
+ intval(substr($hms, 4, 2));
}
protected static function s_get($time, int $unit=self::UNIT_SECONDS): int {
if ($time === null) {
return 0;
} elseif ($time instanceof self) {
return $time->getSeconds();
} elseif (is_int($time)) {
return $time * $unit;
} elseif (is_string($time)) {
$matched = false;
foreach (self::PATTERNS as $pattern) {
if (preg_match($pattern, $time, $ms)) {
$matched = true;
break;
}
}
if ($matched) {
$h = $ms[1];
$m = $ms[2] ?? 0;
$s = $ms[3] ?? 0;
return intval($h) * 3600 + intval($m) * 60 + intval($s);
}
} elseif ($time instanceof DateTimeInterface) {
$hms = $time->format('His');
return intval(substr($hms, 0, 2)) * 3600
+ intval(substr($hms, 2, 2)) * 60
+ intval(substr($hms, 4, 2));
} elseif (is_array($time) && count($time) == 3) {
[$h, $m, $s] = $time;
return $h * 3600 + $m * 60 + $s;
}
throw exceptions::invalid_value($time, "time");
}
protected static function s_adjust(int &$seconds, int $unit=self::UNIT_SECONDS, ?int $step=null): int {
if ($step !== null) $unit *= $step;
$adjust = $seconds % $unit;
if ($seconds < 0) $adjust = -$adjust;
$seconds -= $adjust;
return $seconds;
}
protected static function s_wrap_start(int &$seconds): int {
while ($seconds < 0) $seconds += 86400;
if ($seconds >= 86400) $seconds %= 86400;
return $seconds;
}
protected static function s_wrap_end(int &$seconds): int {
while ($seconds < 0) $seconds += 86400;
if ($seconds > 86400) $seconds %= 86400;
return $seconds;
}
/**
* @var int la valeur de l'unité en secondes, pour le constructeur et les
* méthodes {@link setu()}, {@link addu()} et {@link subu()}
*/
const UNIT = self::UNIT_SECONDS;
/**
* @var int|null un nombre d'unité dont l'heure doit être multiple. par
* exemple, si l'unité est la minute, une valeur 5 permet d'avoir des heures
* qui vont de 5 en 5 minutes (0h00, 0h05, 0h10, etc.)
*/
const STEP = null;
/** @var bool s'il faut garder les heures dans la plage [0, 24h] */
const WRAP = true;
function __construct($time=null, ?array $params=null) {
$this->unit = vint::with($params["unit"] ?? static::UNIT);
$this->step = vint::withn($params["step"] ?? self::STEP);
$this->wrap = vbool::with($params["wrap"] ?? self::WRAP);
if ($time === null) $seconds = self::s_now();
else $seconds = self::s_get($time, $this->unit);
$this->setSeconds($seconds);
}
protected int $unit;
protected ?int $step;
protected bool $wrap;
protected int $seconds;
function getSeconds(): int {
return $this->seconds;
}
/**
* mettre à jour cet objet avec le nombre de secondes spécifié
*
* le nombre effectif de secondes est calculé en tenant compte de l'unité
* actuelle
*
* @return int le nombre de seconde effectif, après correction
*/
protected function setSeconds(?int $seconds): int {
$this->seconds = $seconds ?? self::s_now();
return $this->afterUpdate();
}
protected function afterUpdate(): int {
self::s_adjust($this->seconds, $this->unit, $this->step);
if ($this->wrap) $this->wrapEnd();
return $this->seconds;
}
/**
* wrapper l'heure pour la garder dans la plage [0h, 24h[ ce qui la rend
* propice à l'utilisation comme borne inférieure d'une période
*/
function wrapStart(): self {
self::s_wrap_start($this->seconds);
return $this;
}
/**
* wrapper l'heure pour la garder dans la plage [0h, 24h] ce qui la rend
* propice à l'utilisation comme borne supérieure d'une période
*/
function wrapEnd(): self {
self::s_wrap_end($this->seconds);
return $this;
}
/** formatter cette heure pour affichage */
function format(?string $format=null): string {
if ($format === null) $format = static::FORMAT;
$v = $this->seconds;
$h = intdiv($v, 3600); $v = $v % 3600;
$m = intdiv($v, 60);
$s = $v % 60;
$searches = [
"%H", "%h",
"%M", "%m",
"%S", "%s",
"%%",
];
$replaces = [
sprintf("%02u", $h), strval($h),
sprintf("%02u", $m), strval($m),
sprintf("%02u", $s), strval($s),
"%",
];
return str_replace($searches, $replaces, $format);
}
function __toString(): string {
return $this->format();
}
/** @return int le nombre d'unités */
function getu(): int {
return intdiv($this->seconds, $this->unit);
}
/** créer une nouvelle heure avec le nombre d'unités spécifiées */
function setu(int $count): self {
$this->setSeconds($count * $this->unit);
return $this;
}
/** créer une nouvelle heure en ajoutant à cette heure le nombre d'unités spécifiées */
function addu(int $count=1): self {
$count *= $this->unit;
if ($this->step !== null) $count *= $this->step;
$this->setSeconds($this->seconds + $count);
return $this;
}
/** créer une nouvelle heure en soustrayant à cette heure le nombre d'unités spécifiées */
function subu(int $count=1): self {
$count *= $this->unit;
if ($this->step !== null) $count *= $this->step;
$this->setSeconds($this->seconds - $count);
return $this;
}
/** forcer cette heure à l'heure spécifiée */
function set($time): self {
if ($time === null) $seconds = self::s_now();
else $seconds = self::with($time)->getSeconds();
$this->setSeconds($seconds);
return $this;
}
/** ajouter à cette heure l'heure spécifiée */
function add($time): self {
if ($time !== null) {
$this->setSeconds($this->seconds + self::with($time)->getSeconds());
}
return $this;
}
/** soustraire à cette heure l'heure spécifiée */
function sub($time): self {
if ($time !== null) {
$this->setSeconds($this->seconds - self::with($time)->getSeconds());
}
return $this;
}
/**
* comparer avec l'heure spécifiée. retourner une valeur négative, égale à
* zéro ou positive suivant le résultat de la comparaison
*/
function compare($time): int {
if ($time === null) return 1;
else return $this->seconds - self::with($time)->getSeconds();
}
/**
* tester si cette heure est avant ou égale à l'heure spécifiée
*/
function before($other): bool {
if ($other === null) return false;
else return $this->seconds <= self::with($other)->getSeconds();
}
/**
* tester si cette heure est après ou égale à l'heure spécifiée
*/
function after($other): bool {
if ($other === null) return true;
else return $this->seconds >= self::with($other)->getSeconds();
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace nulib\php\types;
use nulib\php\time\Date;
class vdate {
static function isa($value, bool $strict=false) : bool {
if ($strict) return $value instanceof Date;
else return Date::isa_date($value);
}
static function ensure(&$date): void {
$date = Date::with($date);
}
static function ensuren(&$date): void {
$date = Date::withn($date);
}
static function with($value): Date {
self::ensure($value);
return $value;
}
static function withn($value): ?Date {
self::ensuren($value);
return $value;
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace nulib\php\types;
use nulib\php\time\DateTime;
class vdatetime {
static function isa($value, bool $strict=false) : bool {
if ($strict) return $value instanceof DateTime;
else return DateTime::isa_datetime($value);
}
static function ensure(&$datetime): void {
$datetime = DateTime::with($datetime);
}
static function ensuren(&$datetime): void {
$datetime = DateTime::withn($datetime);
}
static function with($value): DateTime {
self::ensure($value);
return $value;
}
static function withn($value): ?DateTime {
self::ensuren($value);
return $value;
}
}

View File

@ -1,22 +0,0 @@
<?php
namespace nulib\php\types;
class vmixed {
static function isa($value, bool $strict=false) : bool {
return true;
}
static function ensure(&$mixed): void {
}
static function ensuren(&$mixed): void {
}
static function with($value) {
return $value;
}
static function withn($value) {
return $value;
}
}

View File

@ -1,22 +0,0 @@
<?php
namespace nulib\php\types;
class vraw {
static function isa($value, bool $strict=false) : bool {
return true;
}
static function ensure(&$raw): void {
}
static function ensuren(&$raw): void {
}
static function with($value) {
return $value;
}
static function withn($value) {
return $value;
}
}

View File

@ -1,30 +0,0 @@
<?php
namespace nulib\php\types;
use nulib\php\time\DateTime;
use nulib\php\time\Time;
class vtime {
static function isa($value, bool $strict=false) : bool {
if ($strict) return $value instanceof Time;
else return Time::isa_time($value);
}
static function ensure(&$time): void {
$time = Time::with($time);
}
static function ensuren(&$time): void {
$time = Time::withn($time);
}
static function with($value): Time {
self::ensure($value);
return $value;
}
static function withn($value): ?Time {
self::ensuren($value);
return $value;
}
}

View File

@ -1,60 +0,0 @@
<?php
namespace nulib\php\time;
use nulib\tests\TestCase;
use nulib\ValueException;
class HourTest extends TestCase {
function testParse() {
self::assertSame("8h", strval(new Hour("08:00:00")));
self::assertSame("8h", strval(new Hour("8:0")));
self::assertSame("8h", strval(new Hour("8.0")));
self::assertSame("8h", strval(new Hour("8h")));
self::assertSame("8h15", strval(new Hour("08:15:00")));
self::assertSame("8h15", strval(new Hour("8:15")));
self::assertSame("8h15", strval(new Hour("8.15")));
self::assertSame("8h15", strval(new Hour("8h15")));
self::assertSame("8h15", strval(new Hour("08:15:23")));
self::assertSame("8h15", strval(new Hour("8:15.23")));
self::assertSame("8h15", strval(new Hour("8.15.23")));
self::assertSame("8h15", strval(new Hour("8h15.23")));
self::assertSame("31h11", strval(new Hour("30:70:80", [
"wrap" => false,
])));
self::assertSame("7h11", strval(new Hour("30:70:80")));
self::assertException(ValueException::class, function() {
return strval(new Hour("bad format"));
});
}
function testFormat() {
self::assertSame("0h", (new Hour(0))->format());
self::assertSame("0h56", (new Hour(56))->format());
self::assertSame("2h", (new Hour(120))->format());
self::assertSame("23h59", (new Hour(1439))->format());
self::assertSame("24h", (new Hour(1440))->format());
self::assertSame("0h01", (new Hour(1441))->format());
}
function testStep() {
$h = new Hour(null, [
"step" => 5,
]);
$h->setu(10); self::assertSame("0h10", strval($h));
$h->setu(12); self::assertSame("0h10", strval($h));
$h->setu(15); self::assertSame("0h15", strval($h));
$h->setu(17); self::assertSame("0h15", strval($h));
$h->set("8h");
$h->addu(); self::assertSame("8h05", strval($h));
$h->addu(); self::assertSame("8h10", strval($h));
$h->addu(); self::assertSame("8h15", strval($h));
$h->subu(); self::assertSame("8h10", strval($h));
$h->subu(); self::assertSame("8h05", strval($h));
$h->subu(); self::assertSame("8h", strval($h));
}
}

View File

@ -1,74 +0,0 @@
<?php
namespace nulib\php\time;
use nulib\tests\TestCase;
use nulib\ValueException;
class TimeTest extends TestCase {
function testParse() {
self::assertSame("08:00:00", strval(new Time("08:00:00")));
self::assertSame("08:00:00", strval(new Time("8:0")));
self::assertSame("08:00:00", strval(new Time("8.0")));
self::assertSame("08:00:00", strval(new Time("8h")));
self::assertSame("08:15:00", strval(new Time("08:15:00")));
self::assertSame("08:15:00", strval(new Time("8:15")));
self::assertSame("08:15:00", strval(new Time("8.15")));
self::assertSame("08:15:00", strval(new Time("8h15")));
self::assertSame("08:15:23", strval(new Time("08:15:23")));
self::assertSame("08:15:23", strval(new Time("8:15.23")));
self::assertSame("08:15:23", strval(new Time("8.15.23")));
self::assertSame("08:15:23", strval(new Time("8h15.23")));
self::assertSame("31:11:20", strval(new Time("30:70:80", [
"wrap" => false,
])));
self::assertSame("07:11:20", strval(new Time("30:70:80")));
self::assertException(ValueException::class, function() {
return strval(new Time("bad format"));
});
}
function testGetu() {
self::assertSame(0, (new Time(0))->getu());
self::assertSame(86399, (new Time(-1))->getu());
self::assertSame(1, (new Time(1))->getu());
self::assertSame(120, (new Time(120))->getu());
self::assertSame(86400, (new Time(86400))->getu());
self::assertSame(0, (new Time(-86400))->getu());
}
function testAddu() {
$t = new Time(0);
$t->addu(0); self::assertSame(0, $t->getu());
$t->addu(10); self::assertSame(10, $t->getu());
$t->addu(10); self::assertSame(20, $t->getu());
$t->addu(100); self::assertSame(120, $t->getu());
$t->addu(86280); self::assertSame(86400, $t->getu());
$t->addu(86400); self::assertSame(0, $t->getu());
$t->addu(-86400); self::assertSame(0, $t->getu());
}
function testSubu() {
$t = new Time(0);
$t->subu(-86400); self::assertSame(86400, $t->getu());
$t->subu(86400); self::assertSame(0, $t->getu());
$t = new Time(120);
$t->subu(100); self::assertSame(20, $t->getu());
$t->subu(10); self::assertSame(10, $t->getu());
$t->subu(10); self::assertSame(0, $t->getu());
$t->subu(0); self::assertSame(0, $t->getu());
}
function testFormat() {
self::assertSame("00:00:00", (new Time(0))->format());
self::assertSame("00:00:56", (new Time(56))->format());
self::assertSame("00:02:00", (new Time(120))->format());
self::assertSame("23:59:59", (new Time(86399))->format());
self::assertSame("24:00:00", (new Time(86400))->format());
self::assertSame("00:00:01", (new Time(86401))->format());
}
}