Принцип очень простой. Все даты хранятся в локальном времени сервера. Ввод и вывод принимается в локальном времени пользователя. Смещение для пользователя определяется в порядке (только один вариант):
1) по настройке профиля пользователя;
2) автоматически по js, если включено;
3) по глобальной настройке смещения сервера.
Пример: сервер стоит в поясе Москвы, пользователь в Калининграде, включено автоопределение. В форме пользователь вводит "10.09.2015 10:30" и сохраняет. Мы считаем, что это его локальное время. В БД сохраняется в поясе сервера: "10.09.2015 11:30". Теперь тот же пользователь идет в список элементов, где мы выводим ему запись. Читаем из БД "10.09.2015 11:30", знаем, что у него смещение минус час, показываем ему "10.09.2015 10:30". Пользователь видит ровно то, что вводил на форме. Если на этот список посмотрит пользователь из Лондона, то он увидит в своем локальном времени: "10.09.2015 9:30".
Калькуляцией смещения занимается класс CTimeZone. Преобразование времени происходит на уровне записи в БД/выборки из БД в ф-ях CDatabase::DateToCharFunction() и CDatabase::CharToDateFunction().