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));
 | |
|   }
 | |
| }
 |