133 lines
4.0 KiB
PHP
133 lines
4.0 KiB
PHP
<?php
|
|
namespace nur\m;
|
|
|
|
use nur\date;
|
|
|
|
/**
|
|
* Class sql_date: méthodes pour gérer des dates SQL au format YYYY-mm-dd
|
|
*/
|
|
class sql_date {
|
|
/**
|
|
* Tester si $date est une date/heure valide de la forme "YYYY-mm-dd HH:MM:SS"
|
|
*
|
|
* Si oui, $ms obtient les 6 éléments de la chaine
|
|
*/
|
|
static function is_datetime($date, ?array &$ms=null): bool {
|
|
return is_string($date) && preg_match('/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/', $date, $ms);
|
|
}
|
|
|
|
/**
|
|
* Tester si $date est une date valide de la forme "YYYY-mm-dd [00:00:00]"
|
|
*
|
|
* Si oui, $ms obtient les 3 éléments de la chaine
|
|
*/
|
|
static function is_date($date, ?array &$ms=null): bool {
|
|
return is_string($date) && preg_match('/^(\d{4})-(\d{2})-(\d{2})(?: 00:00:00)?$/', $date, $ms);
|
|
}
|
|
|
|
/** retourner la date/heure courante au format 'YYYY-mm-dd HH:MM:SS' */
|
|
static function datetime(): string {
|
|
return strftime("%Y-%m-%d %H:%M:%S");
|
|
}
|
|
|
|
/** retourner la date courante au format 'YYYY-mm-dd' */
|
|
static function date(): string {
|
|
return strftime("%Y-%m-%d");
|
|
}
|
|
|
|
/**
|
|
* transformer une date/heure française "dd/mm/YYYY [HH:MM:SS]" au format
|
|
* SQL "YYYY-mm-dd HH:MM:SS" pour insertion ou mise à jour de la base de
|
|
* données
|
|
*/
|
|
static function _from_datetime(string $date): string {
|
|
$ms = null;
|
|
if (date::is_datetime($date, $ms)) {
|
|
$d = intval($ms[1]);
|
|
$m = intval($ms[2]);
|
|
$y = date::fix_any_year($ms[3]);
|
|
$H = intval($ms[4]);
|
|
$M = intval($ms[5]);
|
|
$S = intval(isset($ms[6])? $ms[6]: 0);
|
|
} elseif (date::is_date($date, $ms)) {
|
|
$d = intval($ms[1]);
|
|
$m = intval($ms[2]);
|
|
$y = date::fix_any_year($ms[3]);
|
|
$H = 0;
|
|
$M = 0;
|
|
$S = 0;
|
|
} else {
|
|
return $date;
|
|
}
|
|
return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $y, $m, $d, $H, $M, $S);
|
|
}
|
|
|
|
/**
|
|
* transformer une date/heure française "dd/mm/YYYY [HH:MM:SS]" au format
|
|
* SQL "YYYY-mm-dd HH:MM:SS" pour insertion ou mise à jour de la base de
|
|
* données.
|
|
* Retourner inchangées les valeurs null et false ainsi que les dates invalides
|
|
*/
|
|
static function from_datetime($date) {
|
|
if ($date === null || $date === false) return $date;
|
|
else return self::_from_datetime($date);
|
|
}
|
|
|
|
/**
|
|
* transformer une date française "dd/mm/YYYY" au format sql "YYYY-mm-dd"
|
|
* pour insertion ou mise à jour de la base de données
|
|
*/
|
|
static function _from_date(string $date): string {
|
|
$ms = null;
|
|
if (date::is_datetime($date, $ms)) {
|
|
$d = intval($ms[1]);
|
|
$m = intval($ms[2]);
|
|
$y = date::fix_any_year($ms[3]);
|
|
} elseif (date::is_date($date, $ms)) {
|
|
$d = intval($ms[1]);
|
|
$m = intval($ms[2]);
|
|
$y = date::fix_any_year($ms[3]);
|
|
} else {
|
|
return $date;
|
|
}
|
|
return sprintf("%04d-%02d-%02d", $y, $m, $d);
|
|
}
|
|
|
|
/**
|
|
* transformer une date française "dd/mm/YYYY" au format sql "YYYY-mm-dd"
|
|
* pour insertion ou mise à jour de la base de données
|
|
* Retourner inchangées les valeurs null et false ainsi que les dates invalides
|
|
*/
|
|
static function from_date(?string $date): ?string {
|
|
if ($date === null || $date === false) return $date;
|
|
else return self::_from_date($date);
|
|
}
|
|
|
|
/**
|
|
* transformer une date sql "YYYY-mm-dd" au format français "dd/mm/YYYY"
|
|
*/
|
|
static function to_datetime(?string $mydate, bool $with_seconds=true): ?string {
|
|
if ($mydate === null) return null;
|
|
$ms = null;
|
|
if (self::is_date($mydate, $ms)) {
|
|
return "$ms[3]/$ms[2]/$ms[1]";
|
|
} elseif (self::is_datetime($mydate, $ms)) {
|
|
if ($with_seconds) return "$ms[3]/$ms[2]/$ms[1] $ms[4]:$ms[5]:$ms[6]";
|
|
else return "$ms[3]/$ms[2]/$ms[1] $ms[4]:$ms[5]";
|
|
} else {
|
|
return $mydate;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* transformer une date sql "YYYY-mm-dd" au format français "dd/mm/YYYY"
|
|
*/
|
|
static function to_date(?string $mydate): ?string {
|
|
if ($mydate === null) return null;
|
|
$ms = null;
|
|
if (self::is_date($mydate, $ms)) return "$ms[3]/$ms[2]/$ms[1]";
|
|
elseif (self::is_datetime($mydate, $ms)) return "$ms[3]/$ms[2]/$ms[1]";
|
|
else return $mydate;
|
|
}
|
|
}
|