PDA

View Full Version : vbdate and negative unix timestamp?


boggseric
10-12-2014, 03:33 AM
I am having an issue with a mod displaying the date incorrectly when the unix timestamp is a negative value. Is vbdate setup to handle the negative unix timestamp correctly?

The value of $thispurchdate is -224406000 (11/21/1962) After the line is run below $purchase_date shows up as 12/31/1969.

$purchase_date = vbdate($vbulletin->options['dateformat'], $thispurchdate, true);


vbdate code:

// ################################################## ###########################
/**
* Formats a UNIX timestamp into a human-readable string according to vBulletin prefs
*
* Note: Ifvbdate() is called with a date format other than than one in $vbulletin->options[],
* set $locale to false unless you dynamically set the date() and strftime() formats in the vbdate() call.
*
* @param string Date format string (same syntax as PHP's date() function)
* @param integer Unix time stamp
* @param boolean If true, attempt to show strings like "Yesterday, 12pm" instead of full date string
* @param boolean If true, and user has a language locale, use strftime() to generate language specific dates
* @param boolean If true, don't adjust time to user's adjusted time .. (think gmdate instead of date!)
* @param boolean If true, uses gmstrftime() and gmdate() instead of strftime() and date()
* @param array If set, use specified info instead of $vbulletin->userinfo
*
* @return string Formatted date string
*/
function vbdate($format, $timestamp = TIMENOW, $doyestoday = false, $locale = true, $adjust = true, $gmdate = false, $userinfo = '')
{
global $vbulletin, $vbphrase;
$uselocale = false;

if (defined('VB_API') AND VB_API === true)
{
$doyestoday = false;
}

if (is_array($userinfo) AND !empty($userinfo))
{
if ($userinfo['lang_locale'])
{
$uselocale = true;
$currentlocale = setlocale(LC_TIME, 0);
setlocale(LC_TIME, $userinfo['lang_locale']);
if (substr($userinfo['lang_locale'], 0, 5) != 'tr_TR')
{
setlocale(LC_CTYPE, $userinfo['lang_locale']);
}
}
if ($userinfo['dstonoff'])
{
// DST is on, add an hour
$userinfo['timezoneoffset']++;
if (substr($userinfo['timezoneoffset'], 0, 1) != '-')
{
// recorrect so that it has a + sign, if necessary
$userinfo['timezoneoffset'] = '+' . $userinfo['timezoneoffset'];
}
}
$hourdiff = (date('Z', TIMENOW) / 3600 - $userinfo['timezoneoffset']) * 3600;
}
else
{
$hourdiff = $vbulletin->options['hourdiff'];
if ($vbulletin->userinfo['lang_locale'] AND !(defined('VB_API') AND VB_API === true))
{
$uselocale = true;
}
}

if ($uselocale AND $locale)
{
if ($gmdate)
{
$datefunc = 'gmstrftime';
}
else
{
$datefunc = 'strftime';
}
}
else
{
if ($gmdate)
{
$datefunc = 'gmdate';
}
else
{
$datefunc = 'date';
}
}
if (!$adjust)
{
$hourdiff = 0;
}
$timestamp_adjusted = max(0, $timestamp - $hourdiff);

if ($format == $vbulletin->options['dateformat'] AND $doyestoday AND $vbulletin->options['yestoday'])
{
if ($vbulletin->options['yestoday'] == 1)
{
if (!defined('TODAYDATE'))
{
define ('TODAYDATE', vbdate('n-j-Y', TIMENOW, false, false));
define ('YESTDATE', vbdate('n-j-Y', TIMENOW - 86400, false, false));
define ('TOMDATE', vbdate('n-j-Y', TIMENOW + 86400, false, false));
}

$datetest = @date('n-j-Y', $timestamp - $hourdiff);

if ($datetest == TODAYDATE)
{
$returndate = $vbphrase['today'];
}
else if ($datetest == YESTDATE)
{
$returndate = $vbphrase['yesterday'];
}
else
{
$returndate = $datefunc($format, $timestamp_adjusted);
}
}
else
{
$timediff = TIMENOW - $timestamp;

if ($timediff >= 0)
{
if ($timediff < 120)
{
$returndate = $vbphrase['1_minute_ago'];
}
else if ($timediff < 3600)
{
$returndate = construct_phrase($vbphrase['x_minutes_ago'], intval($timediff / 60));
}
else if ($timediff < 7200)
{
$returndate = $vbphrase['1_hour_ago'];
}
else if ($timediff < 86400)
{
$returndate = construct_phrase($vbphrase['x_hours_ago'], intval($timediff / 3600));
}
else if ($timediff < 172800)
{
$returndate = $vbphrase['1_day_ago'];
}
else if ($timediff < 604800)
{
$returndate = construct_phrase($vbphrase['x_days_ago'], intval($timediff / 86400));
}
else if ($timediff < 1209600)
{
$returndate = $vbphrase['1_week_ago'];
}
else if ($timediff < 3024000)
{
$returndate = construct_phrase($vbphrase['x_weeks_ago'], intval($timediff / 604900));
}
else
{
$returndate = $datefunc($format, $timestamp_adjusted);
}
}
else
{
$returndate = $datefunc($format, $timestamp_adjusted);
}
}
}
else
{
$returndate = $datefunc($format, $timestamp_adjusted);
}

if (!empty($userinfo['lang_locale']))
{
setlocale(LC_TIME, $currentlocale);
if (substr($currentlocale, 0, 5) != 'tr_TR')
{
setlocale(LC_CTYPE, $currentlocale);
}
}
return $returndate;
}