Я лично не очень знаком с setlocale() (возможно, он уместнее), но в своем творчестве использую такой подход (и пока доволен:
В файле настроек:
$GMT=2*3600; // Желаемый (свой) GMT-сдвиг в сек., false - если юзать системный
$SERVER_TIME_CORRECTION=0; // На случай если часики на серваке просто сбиты
В файле инициализации:
$TIME=time()+$SERVER_TIME_CORRECTION; // Юзать везде потом, явно.
$SERVER_GMT=(int)date("Z",86400); // В зимнее время
if (is_bool($GMT)) $GMT=$SERVER_GMT;
$GMT_DIFF=$GMT-$SERVER_GMT;
Функция, юзаемая везде вместо date(), формат тот же:
function site_date($format_str,$timestamp=-1) {
global $TIME,$GMT_DIFF;
if ($timestamp==-1) $timestamp=$TIME;
return date($format_str,$timestamp+$GMT_DIFF);
}