Я бы настоятельно предложил бы избегать путаницы с метками времени UNIX, чтобы он выглядел как другой часовой пояс. Это урок, который я усвоил трудным путем, слишком много раз.
Отметка времени - это количество секунд с полуночи 1 января 1970 года по Гринвичу. Неважно, где вы находитесь в мире, данная временная метка представляет один и тот же момент времени, независимо от часовых поясов. Да, отметка времени «0» означает 10:00 1/1/70 в Австралии, полночь 1/1/70 в Лондоне и 17:00 31/12/69 в Лос-Анджелесе, но это не значит, что вы можете просто добавлять или вычитать значения и гарантировать точность.
Золотой пример, из-за которого я слишком долго мучил меня каждый год, - это когда летние сбережения вырастут. Летнее время означает, что есть «часы», которых нет в некоторых частях мира. Например, в большинстве районов США не было такого времени, как 2:01, 2 апреля 2006 года.
Впрочем, достаточно квазиразборчивого разглагольствования. Мой совет - хранить ваши даты в базе данных в виде меток времени, а затем ...
Например,
$timestamp = time();
echo "BRISBANE: " . date('r', $timestamp) . "\n";
echo " UTC: " . gmdate('r', $timestamp) . "\n";
date_default_timezone_set('Africa/Johannesburg');
echo " JOBURG: " . date('r', $timestamp) . "\n";
// BRISBANE: Tue, 12 May 2009 18:28:20 +1000
// UTC: Tue, 12 May 2009 08:28:20 +0000
// JOBURG: Tue, 12 May 2009 10:28:20 +0200
Это сохранит ваши значения в чистоте (вам не нужно беспокоиться о добавлении смещений, а затем вычитании перед сохранением), при этом будут соблюдены все правила перехода на летнее время, и вам также не придется даже искать часовой пояс нужного вам места.