mirror of
				https://github.com/alchemy-fr/Phraseanet.git
				synced 2025-10-24 18:33:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			391 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			391 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  * This file is part of Phraseanet
 | |
|  *
 | |
|  * (c) 2005-2014 Alchemy
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| use Alchemy\Phrasea\Application;
 | |
| 
 | |
| /*
 | |
|  * Phraseanet Date class, mostly inspired by :
 | |
|  *
 | |
|  * JavaScript Pretty Date
 | |
|  * Copyright (c) 2008 John Resig (jquery.com)
 | |
|  * Licensed under the MIT license.
 | |
|  *
 | |
|  * Ported to PHP >= 5.1 by Zach Leatherman (zachleat.com)
 | |
|  * Slight modification denoted below to handle months and years.
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| class phraseadate
 | |
| {
 | |
| 
 | |
|     private $app;
 | |
| 
 | |
|     public function __construct(Application $app)
 | |
|     {
 | |
|         $this->app = $app;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  DateTime $date
 | |
|      * @return string
 | |
|      */
 | |
|     public function getTime(DateTime $date)
 | |
|     {
 | |
|         switch ($this->app['locale']) {
 | |
|             default:
 | |
|             case 'fr':
 | |
|             case 'de':
 | |
|                 $time = $date->format('H:i');
 | |
|                 break;
 | |
|             case 'en':
 | |
|                 $time = $date->format('h:iA');
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return $time;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  DateTime $date
 | |
|      * @return string
 | |
|      */
 | |
|     public function getDate(DateTime $date)
 | |
|     {
 | |
|         $compareTo = new DateTime('now');
 | |
|         $diff = $compareTo->format('U') - $date->format('U');
 | |
|         $dayDiff = floor($diff / 86400);
 | |
| 
 | |
|         if (is_nan($dayDiff)) {
 | |
|             return '';
 | |
|         }
 | |
| 
 | |
|         if ($dayDiff < 365) {
 | |
|             return $this->formatDate($date, $this->app['locale'], 'DAY_MONTH');
 | |
|         } else {
 | |
|             return $this->formatDate($date, $this->app['locale'], 'DAY_MONTH_YEAR');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  DateTime $date
 | |
|      * @return string
 | |
|      */
 | |
|     public function getPrettyString(DateTime $date = null)
 | |
|     {
 | |
|         if (is_null($date)) {
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         $compareTo = new DateTime('now');
 | |
|         $diff = $compareTo->format('U') - $date->format('U');
 | |
|         $dayDiff = floor($diff / 86400);
 | |
| 
 | |
|         if (is_nan($dayDiff) || $dayDiff > 365000) {
 | |
|             return '';
 | |
|         }
 | |
| 
 | |
|         $date_string = $this->formatDate($date, $this->app['locale'], 'DAY_MONTH');
 | |
| 
 | |
|         if ($dayDiff == 0) {
 | |
|             if ($diff < 60) {
 | |
|                 return $this->app->trans('phraseanet::temps:: a l\'instant');
 | |
|             } elseif ($diff < 120) {
 | |
|                 return $this->app->trans('phraseanet::temps:: il y a une minute');
 | |
|             } elseif ($diff < 3600) {
 | |
|                 return $this->app->trans('phraseanet::temps:: il y a %quantity% minutes', ['%quantity%' => floor($diff / 60)]);
 | |
|             } elseif ($diff < 7200) {
 | |
|                 return $this->app->trans('phraseanet::temps:: il y a une heure');
 | |
|             } elseif ($diff < 86400) {
 | |
|                 return $this->app->trans('phraseanet::temps:: il y a %quantity% heures', ['%quantity%' => floor($diff / 3600)]);
 | |
|             }
 | |
|         } elseif ($dayDiff == 1) {
 | |
|             return $this->app->trans('phraseanet::temps:: hier');
 | |
|         } elseif ($dayDiff < 365 && $dayDiff > 0) {
 | |
|             return $date_string;
 | |
|         } else {
 | |
|             return $this->formatDate($date, $this->app['locale'], 'DAY_MONTH_YEAR');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  DateTime $date
 | |
|      * @return string
 | |
|      */
 | |
|     public function format_mysql(DateTime $date)
 | |
|     {
 | |
|         return $date->format(DATE_ISO8601);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  DateTime $date
 | |
|      * @param  string   $locale
 | |
|      * @param  string   $format
 | |
|      * @return string
 | |
|      */
 | |
|     private function formatDate(DateTime $date, $locale, $format)
 | |
|     {
 | |
| 
 | |
|         switch ($locale) {
 | |
|             default:
 | |
|             case 'fr':
 | |
|                 switch ($format) {
 | |
|                     default:
 | |
|                     case 'DAY_MONTH':
 | |
|                         $date_formated = strftime("%e %B", $date->format('U'));
 | |
|                         break;
 | |
|                     case 'DAY_MONTH_YEAR':
 | |
|                         $date_formated = strftime("%e %B %Y", $date->format('U'));
 | |
|                         break;
 | |
|                 }
 | |
|                 break;
 | |
|             case 'en':
 | |
|                 switch ($format) {
 | |
|                     default:
 | |
|                     case 'DAY_MONTH':
 | |
|                         $date_formated = strftime("%B %e", $date->format('U'));
 | |
|                         break;
 | |
|                     case 'DAY_MONTH_YEAR':
 | |
|                         $date_formated = strftime("%B %e %Y", $date->format('U'));
 | |
|                         break;
 | |
|                 }
 | |
|                 break;
 | |
|             case 'de':
 | |
|                 switch ($format) {
 | |
|                     default:
 | |
|                     case 'DAY_MONTH':
 | |
|                         $date_formated = strftime("%e. %B", $date->format('U'));
 | |
|                         break;
 | |
|                     case 'DAY_MONTH_YEAR':
 | |
|                         $date_formated = strftime("%e. %B %Y", $date->format('U'));
 | |
|                         break;
 | |
|                 }
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return $date_formated;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string $isodelimdate
 | |
|      * @param  string $format
 | |
|      * @return string
 | |
|      */
 | |
|     public function isodateToDate($isodelimdate, $format)
 | |
|     {
 | |
|         $tc = [];
 | |
|         $bal = [];
 | |
|         $isodelimdate = trim($isodelimdate);
 | |
| 
 | |
|         while ($isodelimdate != "") {
 | |
|             if (($c = $isodelimdate[0]) == "<") {
 | |
|                 if (($p = strpos($isodelimdate, ">")) !== false) {
 | |
|                     if ($isodelimdate[1] == "/") {
 | |
|                         array_pop($bal);
 | |
|                     } else {
 | |
|                         if ($isodelimdate[$p - 1] != "/")
 | |
|                             array_push($bal, substr($isodelimdate, 1, $p - 1));
 | |
|                     }
 | |
|                     $isodelimdate = substr($isodelimdate, $p + 1);
 | |
|                 } else {
 | |
|                     $isodelimdate = "";
 | |
|                 }
 | |
|             } else {
 | |
|                 $tc[] = ["char"        => $c, "bals"        => $bal];
 | |
|                 $isodelimdate = substr($isodelimdate, 1);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $strdate = "";
 | |
|         $paterns = ["YYYY" => 0, "YY"   => 2, "MM"   => 5,
 | |
|             "DD"   => 8, "HH"   => 11, "NN"   => 14, "SS"   => 17];
 | |
| 
 | |
|         while ($format != "") {
 | |
|             $patfound = false;
 | |
|             foreach ($paterns as $pat => $idx) {
 | |
|                 if (substr($format, 0, ($l = strlen($pat))) == $pat) {
 | |
|                     for ($i = 0; $i < $l; $i ++) {
 | |
|                         $bal_out = "";
 | |
|                         if (isset($tc[$idx + $i])) {
 | |
|                             foreach ($tc[$idx + $i]["bals"] as $b) {
 | |
|                                 $strdate .= "<$b>";
 | |
|                                 $bal_out = "</$b>" . $bal_out;
 | |
|                             }
 | |
|                             $strdate .= $tc[$idx + $i]["char"] . $bal_out;
 | |
|                         }
 | |
|                     }
 | |
|                     $format = substr($format, $l);
 | |
|                     $patfound = true;
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             if (! $patfound) {
 | |
|                 $strdate .= $format[0];
 | |
|                 $format = substr($format, 1);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return($strdate);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string $strdate
 | |
|      * @param  string $format
 | |
|      * @return string
 | |
|      */
 | |
|     public function dateToIsodate($strdate, $format)
 | |
|     {
 | |
|         $v_y = $v_m = $v_d = $v_h = $v_n = $v_s = 0;
 | |
|         $v = str_replace(
 | |
|             ["-", ":", "/", "."], [" ", " ", " ", " "], trim($strdate)
 | |
|         );
 | |
|         $n = 0;
 | |
| 
 | |
|         $format = str_replace(
 | |
|             ["-", ":", "/", "."], [" ", " ", " ", " "], $format
 | |
|         );
 | |
|         $isodelimdate = null;
 | |
|         switch ($format) {
 | |
|             case "MM YYYY":
 | |
|             case "MM YYYY HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d", $v_m, $v_y, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "MMYYYY":
 | |
|             case "MMYYYYHHNNSS":
 | |
|                 $n = sscanf($v, "%d%d%d%d%d", $v_m, $v_y, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "DD MM YYYY":
 | |
|             case "DD MM YYYY HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_d, $v_m, $v_y, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "DDMMYYYY":
 | |
|             case "DDMMYYYYHHNNSS":
 | |
|                 $n = sscanf($v, "%02d%02d%04d%02d%02d%02d", $v_d, $v_m, $v_y, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "DD MM YY":
 | |
|             case "DD MM YY HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_d, $v_m, $v_y, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                 if ($v_y < 100)
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "DDMMYY":
 | |
|             case "DDMMYYHHNNSS":
 | |
|                 $n = sscanf($v, "%02d%02d%02d%02d%02d%02d", $v_d, $v_m, $v_y, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "MM DD YYYY":
 | |
|             case "MM DD YYYY HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_m, $v_d, $v_y, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "MMDDYYYY":
 | |
|             case "MMDDYYYYHHNNSS":
 | |
|                 $n = sscanf($v, "%02d%02d%04d%02d%02d%02d", $v_m, $v_d, $v_y, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "MM DD YY":
 | |
|             case "MM DD YY HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_m, $v_d, $v_y, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                 if ($v_y < 100)
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "MMDDYY":
 | |
|             case "MMDDYYHHNNSS":
 | |
|                 $n = sscanf($v, "%02d%02d%02d%02d%02d%02d", $v_m, $v_d, $v_y, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "YYYY MM DD":
 | |
|             case "YYYY MM DD HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_y, $v_m, $v_d, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "YYYYMMDD":
 | |
|             case "YYYYMMDDHHNNSS":
 | |
|                 $n = sscanf($v, "%04d%02d%02d%02d%02d%02d", $v_y, $v_m, $v_d, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "YY MM DD":
 | |
|             case "YY MM DD HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_y, $v_m, $v_d, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                 if ($v_y < 100)
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "YYMMDD":
 | |
|             case "YYMMDDHHNNSS":
 | |
|                 $n = sscanf($v, "%02d%02d%02d%02d%02d%02d", $v_y, $v_m, $v_d, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "YYYY DD MM":
 | |
|             case "YYYY DD MM HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_y, $v_d, $v_m, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "YYYYDDMM":
 | |
|             case "YYYYDDMMHHNNSS":
 | |
|                 $n = sscanf($v, "%04d%02d%02d%02d%02d%02d", $v_y, $v_d, $v_m, $v_h, $v_n, $v_s);
 | |
|                 break;
 | |
|             case "YY DD MM":
 | |
|             case "YY DD MM HH NN SS":
 | |
|                 $n = sscanf($v, "%d %d %d %d %d %d", $v_y, $v_d, $v_m, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                 if ($v_y < 100)
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             case "YYDDMM":
 | |
|             case "YYDDMMHHNNSS":
 | |
|                 $n = sscanf($v, "%02d%02d%02d%02d%02d%02d", $v_y, $v_d, $v_m, $v_h, $v_n, $v_s);
 | |
|                 if ($v_y < 20)
 | |
|                     $v_y += 2000;
 | |
|                 else
 | |
|                     $v += 1900;
 | |
|                 break;
 | |
|             default:
 | |
|                 $n = 0;
 | |
|                 break;
 | |
|         }
 | |
|         if ($n > 0) {
 | |
|             if ($v_y >= 0 && $v_y <= 9999 && $v_m >= 0 && $v_m <= 99
 | |
|                 && $v_d >= 0 && $v_d <= 99 && $v_h >= 0 && $v_h <= 99
 | |
|                 && $v_n >= 0 && $v_n <= 99 && $v_s >= 0 && $v_s <= 99) {
 | |
|                 $isodelimdate = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $v_y, $v_m, $v_d, $v_h, $v_n, $v_s);
 | |
|             } else {
 | |
| 
 | |
|             }
 | |
|         } else {
 | |
| 
 | |
|         }
 | |
| 
 | |
|         return($isodelimdate);
 | |
|     }
 | |
| }
 | 
