nur-sery/nur_src/m/sql_date.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;
}
}