1
0
mirror of https://github.com/e107inc/e107.git synced 2025-01-18 05:09:05 +01:00
php-e107/e107_handlers/date_handler.php

142 lines
3.9 KiB
PHP

<?php
/*
+ ----------------------------------------------------------------------------+
| e107 website system
|
| ©Steve Dunstan 2001-2002
| http://e107.org
| jalist@e107.org
|
| Released under the terms and conditions of the
| GNU General Public License (http://gnu.org).
|
| $Source: /cvs_backup/e107_0.8/e107_handlers/date_handler.php,v $
| $Revision: 1.3 $
| $Date: 2006-12-23 15:44:31 $
| $Author: e107steved $
|
+----------------------------------------------------------------------------+
*/
if (!defined('e107_INIT')) { exit; }
if (is_readable(e_LANGUAGEDIR.e_LANGUAGE."/lan_date.php")) {
@include_once(e_LANGUAGEDIR.e_LANGUAGE."/lan_date.php");
} else {
@include_once(e_LANGUAGEDIR."English/lan_date.php");
}
class convert
{
function convert_date($datestamp, $mode = "long") {
/*
# Date convert
# - parameter #1: string $datestamp, unix stamp
# - parameter #2: string $mode, date format, default long
# - return parsed text
# - scope public
*/
global $pref;
$datestamp += TIMEOFFSET;
if ($mode == "long") {
return strftime($pref['longdate'], $datestamp);
} else if ($mode == "short") {
return strftime($pref['shortdate'], $datestamp);
} else {
return strftime($pref['forumdate'], $datestamp);
}
}
function computeLapse($older_date, $newer_date = FALSE, $mode = FALSE, $show_secs = TRUE, $format = 'long')
{ /*
$mode = TRUE :: return array
$mode = FALSE :: return string
*/
if($format == 'short')
{
$sec = LANDT_09;
$secs = LANDT_09s;
$min = LANDT_08;
$mins = LANDT_08s;
}
else
{
$sec = LANDT_07;
$secs = LANDT_07s;
$min = LANDT_06;
$mins = LANDT_06s;
}
/*
If we want an absolutely accurate result, main problems arise from the varying numbers of days in a month.
If we go over a month boundary, then we need to add days to end of start month, plus days in 'end' month
If start day > end day, we cross a month boundary. Calculate last day of start date. Otherwise we can just do a simple difference.
*/
$newer_date = ($newer_date == FALSE ? (time()) : $newer_date);
if($older_date>$newer_date)
{ // Just in case the wrong way round
$tmp=$newer_date;
$newer_date=$older_date;
$older_date=$tmp;
}
$new_date = getdate($newer_date);
$old_date = getdate($older_date);
$result = array();
$outputArray = array();
$params = array(
6 => array('seconds',60, $sec, $secs),
5 => array('minutes',60, $min, $mins),
4 => array('hours',24, LANDT_05, LANDT_05s),
3 => array('mday', -1, LANDT_04, LANDT_04s),
2 => array('',-3, LANDT_03, LANDT_03s),
1 => array('mon',12, LANDT_02, LANDT_02s),
0 => array('year', -2, LANDT_01,LANDT_01s)
);
$cy = 0;
foreach ($params as $parkey => $parval)
{
if ($parkey == 2)
{
$result['2'] = floor($result['3']/7);
$result['3'] = fmod($result['3'],7);
}
else
{
$tmp = $new_date[$parval[0]] - $old_date[$parval[0]] - $cy;
$scy = $cy;
$cy = 0;
if ($tmp < 0)
{
switch ($parval[1])
{
case -1 : // Wrapround on months - special treatment
$tempdate = getdate(mktime(0,0,0,$old_date['mon']+1,1,$old_date['year']) - 1); // Last day of month
$tmp = $tempdate['mday'] - $old_date['mday'] + $new_date['mday'] - $scy;
$cy = 1;
break;
case -2 : // Year wraparound - shouldn't happen
case -3 : // Week processing - this shouldn't happen either
echo "Code bug!<br />";
break;
default :
$cy = 1;
$tmp += $parval[1];
}
}
$result[$parkey] = $tmp;
}
}
// Generate output array, add text
for ($i = 0; $i < ($show_secs ? 7 : 6); $i++)
{
$outputArray[] = $result[$i]." ".($result[$i] == 1 ? $params[$i][2] : $params[$i][3]);
}
return ($mode ? $outputArray : implode(", ", $outputArray));
}
}