Как лучше учитывать часовой пояс пользователя?
Для того, чтобы проводить все вычисления в таймзоне пользователя, можно сделать следующее:
1. Тип данных для поля в MySQL: timestamp
2. Задание таймзоны для соединения в MySQL: set time_zone = 'America/New_York' (никаких GMT+X !)
3. Задание дефолтной таймзоны в PHP: date_default_timezone_set('America/New_York'); (и снова, никаких GMT+X! это важно)

После этого, все даты вы будете получать из базы в указанной таймзоне, операции вида date('Y-m-d H:i:s') также будут выдавать данные согласно указанной таймзоне, сохранять данные, пришедшие от пользователя в его таймзоне вы также можете напрямую в базу.

Чтобы MySQL принимал Olson DB identifiers (как в пункте 2) нужно залить базу таймзон (и, по хорошему, делать это регулярно). Используйте скрипт mysql_tzinfo_to_sql из стандартной поставки MySQL.

Теперь о том, почему использовать смещения (UTC/GMT+X) плохо. Предположим, от пользователя приходит запрос на создание события, которое произойдет 12 декабря 2013 года, в 10:00. Текущее смещение времени пользователя (которое вы можете, например, получить через яваскрипт) — UTC+3. Значит ли это, что событие на сервере должно произойти 2013-12-12 10:00:00 UTC+3? Если пользователь из Калининграда — то да (поскольку летнее/зимнее время в России отменили), если пользователь из Украины (где используется перевод часов) — то нет, событие должно произойти 2013-12-12 10:00:00 UTC+2 (поскольку в Украине в этот период будет использоваться зимнее время, UTC+2).
Храню всё время в unix timestamp.
Каждому пользователю выставляю date_default_timezone_set(), если приходит от пользователя дата не в unix timestamp — предполагается что она в этом часовом поясе, обратно конвертация аналогично будет для указанного часового пояса, всё прозрачно и просто.
В БД всё в unix timestamp, в колонке с типом BIGINT.