Если вам нужно манипулировать часовым поясом и вам не нужно сохранять даты до 1970 или после 2038 года, используйте TIMESTAMPs.
Вы можете сделать один оператор SQL:
set timezone='America/New_York';
И все даты, извлеченные из базы данных, будут в EDT.
Я бы не стал делать математику со смещением UTC, поскольку становится трудно правильно обрабатывать все случаи. Лучше всего настроить часовые пояса PHP и MySQL соответствующим образом для каждого пользователя.
TIMESTAMP хранит даты ТОЛЬКО в формате UTC, и MySQL обрабатывает перевод для него.
При сохранении дат:
set time_zone='America/New_York';
insert into SomeTable ( Name, Created, Modified ) VALUES ( 'Dude', '2009-06-15 11:54:00', '2009-06-15 11:54:00');
set time_zone='GMT';
SELECT * FROM SomeTable ORDER BY ID DESC LIMIT 1;
+----+------+---------------------+---------------------+
| ID | Name | Created | Modified |
+----+------+---------------------+---------------------+
| 1 | Dude | 2009-06-15 15:54:00 | 2009-06-15 15:54:00 |
+----+------+---------------------+---------------------+
Просто установите часовой пояс базы данных в зону, в которой находится пользователь, и он будет правильно "скрытно" преобразован в правильную дату по Гринвичу.
Просто убедитесь, что вы не «дважды конвертируете» даты в PHP и MySQL.