142 lines
4.4 KiB
PHP
142 lines
4.4 KiB
PHP
|
<?php
|
||
|
namespace nur;
|
||
|
|
||
|
use nur\b\date\Date as D;
|
||
|
use nur\b\date\Datetime as DT;
|
||
|
use nur\b\date\Elapsed;
|
||
|
|
||
|
/**
|
||
|
* Class date: méthode pour gérer les dates au format français dd/mm/YYYY
|
||
|
*/
|
||
|
class date {
|
||
|
static function is_datetime($date, ?array &$ms=null): bool {
|
||
|
return is_string($date) && preg_match('/^(\d{1,2})[-\/]+(\d{1,2})[-\/]+(\d{2,4}) ([0-9]{1,2})[h:.,]([0-9]{1,2})(?:[:.,]([0-9]{1,2}))?$/', $date, $ms);
|
||
|
}
|
||
|
|
||
|
static function is_date($date, ?array &$ms=null): bool {
|
||
|
return is_string($date) && preg_match('/^(\d{1,2})[-\/]+(\d{1,2})[-\/]+(\d{2,4})(?: 0{1,2}[h:.,]0{1,2}(?:[:.,]0{1,2})?)?$/', $date, $ms);
|
||
|
}
|
||
|
|
||
|
static function datetime(?int $timestamp=null): string {
|
||
|
if ($timestamp === null) $timestamp = time();
|
||
|
return strftime("%d/%m/%Y %H:%M:%S", $timestamp);
|
||
|
}
|
||
|
|
||
|
static function date(?int $timestamp=null): string {
|
||
|
if ($timestamp === null) $timestamp = time();
|
||
|
return strftime("%d/%m/%Y", $timestamp);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* corriger une année à deux chiffres qui est située dans le passé et
|
||
|
* retourner l'année à 4 chiffres.
|
||
|
*
|
||
|
* par exemple, si l'année courante est 2019, alors:
|
||
|
* - fix_past_year('18') === '2018'
|
||
|
* - fix_past_year('19') === '1919'
|
||
|
* - fix_past_year('20') === '1920'
|
||
|
*/
|
||
|
static function fix_past_year(int $year): int {
|
||
|
if ($year < 100) {
|
||
|
$y = getdate(); $y = $y["year"];
|
||
|
$r = $y % 100;
|
||
|
$c = $y - $r;
|
||
|
if ($year >= $r) $year += $c - 100;
|
||
|
else $year += $c;
|
||
|
}
|
||
|
return $year;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* corriger une année à deux chiffres et retourner l'année à 4 chiffres.
|
||
|
* l'année charnière entre année passée et année future est 70
|
||
|
*
|
||
|
* par exemple, si l'année courante est 2019, alors:
|
||
|
* - fix_past_year('18') === '2018'
|
||
|
* - fix_past_year('19') === '2019'
|
||
|
* - fix_past_year('20') === '2020'
|
||
|
* - fix_past_year('69') === '2069'
|
||
|
* - fix_past_year('70') === '1970'
|
||
|
* - fix_past_year('71') === '1971'
|
||
|
*/
|
||
|
static function fix_any_year(int $year): int {
|
||
|
if ($year < 100) {
|
||
|
$y = getdate(); $y = $y["year"];
|
||
|
$r = $y % 100;
|
||
|
$c = $y - $r;
|
||
|
if ($year >= 70) $year += $c - 100;
|
||
|
else $year += $c;
|
||
|
}
|
||
|
return $year;
|
||
|
}
|
||
|
|
||
|
static function _ms2datetime(array $ms, ?string &$date, ?string &$time): void {
|
||
|
$d = intval($ms[1]);
|
||
|
$m = intval($ms[2]);
|
||
|
$y = self::fix_any_year($ms[3]);
|
||
|
$H = intval($ms[4]);
|
||
|
$M = intval($ms[5]);
|
||
|
$S = intval(isset($ms[6])? $ms[6]: 0);
|
||
|
$date = sprintf("%02d/%02d/%04d", $d, $m, $y);
|
||
|
$time = sprintf("%02d:%02d:%02d", $H, $M, $S);
|
||
|
}
|
||
|
|
||
|
static function _ms2date(array $ms, ?string &$date): void {
|
||
|
$d = intval($ms[1]);
|
||
|
$m = intval($ms[2]);
|
||
|
$y = self::fix_any_year($ms[3]);
|
||
|
$date = sprintf("%02d/%02d/%04d", $d, $m, $y);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Analyser $datetime qui peut être de la forme 'dd/mm/YYYY HH:MM:SS' ou
|
||
|
* 'dd/mm/YYYY' et initialiser les variables $date et $time
|
||
|
*
|
||
|
* s'il n'y a pas de composante 'heure' dans $datetime, $time reçoit la
|
||
|
* valeur null.
|
||
|
*
|
||
|
* retourner true si $datetime était au format attendu, false sinon
|
||
|
*/
|
||
|
static function _split_datetime(?string $datetime, ?string &$date, ?string &$time): bool {
|
||
|
$ms = null;
|
||
|
if (self::is_datetime($datetime, $ms)) {
|
||
|
self::_ms2datetime($ms, $date, $time);
|
||
|
return true;
|
||
|
} elseif (self::is_date($datetime, $ms)) {
|
||
|
self::_ms2date($ms, $date);
|
||
|
$time = null;
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static function split_datetime($datetime, ?string &$date, ?string &$time): bool {
|
||
|
if ($datetime === null || $datetime === false) return false;
|
||
|
else return self::_split_datetime($datetime, $date, $time);
|
||
|
}
|
||
|
|
||
|
static function new($date, bool $null_is_now=false): ?DT {
|
||
|
if ($null_is_now && $date === null) return new DT();
|
||
|
elseif ($date === null) return null;
|
||
|
elseif (is_int($date)) return new DT($date);
|
||
|
return self::is_datetime($date)? new DT($date): new D($date);
|
||
|
}
|
||
|
|
||
|
static function before($date, $other): bool {
|
||
|
if ($other === null) return true;
|
||
|
if ($date === null) return false;
|
||
|
return self::new($date)->before(self::new($other));
|
||
|
}
|
||
|
|
||
|
static function after($date, $other): bool {
|
||
|
if ($other === null) return true;
|
||
|
if ($date === null) return false;
|
||
|
return self::new($date)->after(self::new($other));
|
||
|
}
|
||
|
|
||
|
static function get_elapsed($date, $now=null): Elapsed {
|
||
|
return self::new($date, true)->getElapsed(self::new($now));
|
||
|
}
|
||
|
}
|