Когда вы имеете дело с часовыми поясами, вы не хотите самостоятельно выполнять вычисления смещения, особенно если вы работаете с единицами времени, меньшими, чем 1 день. Одна простая причина: летнее время.
И MySQL, и PHP имеют множество функций даты / времени для манипулирования датами. Они знают о летнем времени и других причудах смены дат и времени. И они исправляют это чаще, чем вы, если вы попытаетесь свернуть решение вручную. По крайней мере, используйте (или создайте) объект даты, который включает часовой пояс. Функции PHP могут быть немного хитрыми и, к сожалению, не так хорошо документированы, но все возможности есть. Вы все еще можете использовать метки времени Unix в качестве своего «канонического» формата, но весь код, который работает с ним, должен знать или понимать, в каком часовом поясе он находится «в».
На прошлой работе мне приходилось иметь дело со школьным расписанием и преобразовывать этот формат (термин, неделя, день, период ...) в реальные даты и обратно. Мы создали объект, который выполнял все необходимые преобразования по требованию и кэшировал результаты. Это было усилием, но наличие функций даты PHP, которые делают все преобразования и корректировки, избавило от многих проблем с часовыми поясами и переходом на летнее время.
Еще одна оговорка с календарями: вам, возможно, придется различать часовые пояса событий и часовые пояса пользователей . И когда часовые пояса событий остаются фиксированными и когда они перемещаются вместе с пользователями. Неспособность обработать все нюансы этого является причиной, почему у календаря в Exchange / Outlook все еще есть проблемы с изменениями летнего времени. : -)