Tener problemas de zona horaria con PHP y MySQL

La hora de mi servidor es GMT y hago lo siguiente cada vez que alguien se conecta.

<code>// Set a default timezone
$defaultTimeZone = 'America/Toronto';

// load the user, if they are online...
$onlineUser = new user();
if (isset($_SESSION['user_id']))
{
    if ($onlineUser->loadUser($_SESSION['user_id']))
    {
        $defaultTimeZone = $onlineUser->timeZone;
    }
}

// set time zones
date_default_timezone_set($defaultTimeZone);
$db->query("SET SESSION time_zone = '".$defaultTimeZone."'");
</code>

Entonces, mi problema es este ... cuando alguien hace algo, almacena la fecha / hora en la hora local de los usuarios ... causándome una gran cantidad de problemas.

Lo único que quiero es que todo se almacene en GMT, pero que los usuarios vean e interactúen con los datos en su zona horaria local.

EDITAR:

Aquí es cómo estoy actualizando el estado de los usuarios:

<code>public function updateStatus()
{
    global $db, $common, $config;

    // update the user record
    $data = array(
        'date_last_active'  => new Zend_Db_Expr('NOW()')
    );

    $db->update('users', $data, 'user_id='.$this->userId);
}
</code>

Aquí está mi función para convertir una marca de fecha en segundos ...

<code>public function dateTimeToUnixTime($dateString)
{
    if (strlen($dateString) < 10)
    {
        return "";
    }

    $parseDateTime = split(" ", $dateString);
    $parseDate = split("-", $parseDateTime[0]);

    if (isset($parseDateTime[1]))
    {
        $parseTime = split(":", $parseDateTime[1]);
    }
    else
    {
        $parseTime = split(":", "00:00:00");
    }

    return mktime($parseTime[0], $parseTime[1], $parseTime[2], $parseDate[1], $parseDate[2], $parseDate[0]);
}
</code>

Y finalmente, cómo estoy comparando las fechas:

<code>    $date = $oUser->dateLastActive;

    $lastSeen = abs($common->dateTimeToUnixTime(date('Y-m-d H:i:s')) - $common->dateTimeToUnixTime($date));

    if ($lastSeen < 300 )
    {
        echo "<font size='1' color='green'><strong>Online</strong></font>";
    }

    if ($lastSeen >= 300)
    {
        echo "<font size='1' color='black'><strong>Offline</strong></font>";
    }
</code>

Respuestas a la pregunta(3)

Su respuesta a la pregunta