Files
Phraseanet/lib/classes/phraseadate.php
2014-01-06 15:40:56 +01:00

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